1.滥用表达式作为函数参数默认值
在上面这段代码里,一旦重复调用foo()函数(没有指定一个bar参数),那么将一直返回'bar',因为没有指定参数,那么foo()每次被调用的时候,都会赋予[]。下面来看看,这样做的结果:
解决方案:
2.错误地使用类变量
先看下面这个例子:
3.为异常指定不正确的参数
假设代码中有如下代码:
4.误解Python规则范围
Python的作用域解析是基于LEGB规则,分别是Local、Enclosing、Global、Built-in。实际上,这种解析方法也有一些玄机,看下面这个例子:
02468
解决方案:
在b.py中:
可以很好地工作,也许你会感到惊讶。毕竟,我们确实在这里做了一个循环导入,难道不应该有点问题吗?
仅仅存在一个循环导入并不是Python本身问题,如果一个模块被导入,Python就不会试图重新导入。根据这一点,每个模块在试图访问函数或变量时,可能会在运行时遇到些问题。
当我们试图导入b.py会发生什么(先前没有导入a.py):
出错了,这里的问题是,在导入b.py的过程中还要试图导入a.py,这样就要调用f(),并且试图访问b.x。但是b.x并未被定义。
可以这样解决,仅仅修改b.py导入到a.py中的g()函数:
Python拥有非常丰富的模块库,并且支持“开箱即用”。因此,如果不刻意避免,很容易发生命名冲突事件。例如,在你的代码中可能有一个email.py的模块,由于名称一致,它很有可能与Python自带的标准库模块发生冲突。
在Python 2里面可以很好地运行:
解决方案:
10.滥用__del__方法
比如这里有一个叫mod.py的文件:
下面,你在another_mod.py文件里执行如下操作:
import modmybar = mod.Bar()
你会获得一个AttributeError异常。
至于为什么会出现该异常,点击这里查看详情。当解释器关闭时,该模块的全局变量全部设置为None。因此,在上面这个例子里,当__del__被调用时,foo已经全部被设置为None。
领取专属 10元无门槛券
私享最新 技术干货