写在前面
长期更新的博文。多数是一些比较隐蔽的问题。欢迎留言补充。
pip并不是那么安逸
pip安装对于开发者来说确实是一种解放。可以自动安装依赖包,但执行最简单的pip安装命令时,并不是所有的依赖都会安装。有一些是模块可选择的,比如gunicorn在选择异步框架时。有一些因为调用的层次较多,忽视了,最后pip还是会提醒缺少一些依赖。留心每次安装的结尾。
import时名称相同/相似(但实际模块不同)
近几年出现了较多次针对python供应链的黑客攻击之后,python官方对模块进行了规范,其中包括在pypi中搜索模块时,模块主页上都会有一个安装命令,明确告知安装它的时候该使用什么。
有些是因为升级。比如使用beautifulsoup,虽然名字是叫beautifulsoup,但是它目前对应的模块叫做beautifulsuop4。
还有库存在重名冲突导致产生问题。假如通过阅读import的内容去安装一个模块,之后运行会提示模块中没有代码中的函数或者变量。查看模块源代码确实没有,但是运行的代码同样也不会错,陷入怀疑人生。典型的就是加密库中的cipher,一个是cipher,另一个叫pycipher。但是导入的是同一个名字:cipher。
错误地import了自定义的模块
在新建py文件的时候,可能是因为自己的脑海中反复考虑想着代码功能,然后就以代表程序功能的单词来命名为文件了。import导入的时候,是会引入同目录下的文件的,如果import的名字原本是要调用某个模块的,但是自己编写的函数又起了同样了名字,解释器就会把当前目录下自己写的这个函数编译导入进来。
非常明显的特征:文件夹下出现了一个和.py同名的.pyc文件。
尝试修改字符串
可能是先学了c、java等语言,然后余孽未消,将它们对数组的定义和思维带入到了python中来。python字符串不支持直接修改,修改字符串的某一位或者某几位,需要靠拼接的方法。也是涉及重建一个字符串对象。
is和==不相同
比较值的时候使用==,比较地址的时候使用is。
判定为空列表的时候可以是使用A == []
,但是如果使用A is []
,即便先前赋值A = []
,返回的结果也是False
。
字符串拼接的时候使用+
由于python字符串不可变,每次使用+进行拼接,产生的结果都要在内存中新建一个对象来放置这个新生成的字符串,所以大量拼接操作的性能低下。可以使用内置的join()方法来替代+进行字符串拼接。