进口模块,随机设置为无
问题描述:
我与它具有如下结构的脚本,一个很奇怪的问题:进口模块,随机设置为无
import os
# ... some functions
def function_one():
...
def function_two():
if os.path.isdir(...):
最后一条语句有时会失败,NoneType has no attribute 'path'
和偶然我发现的function_two
def function_two():
if os is None:
print function_one
打印None
。所以不仅os
是None
,而且function_one
也是None
。
我想重现错误但不知道在哪里寻找原因,我没有全局变量,我不修改sys.modules
。
有没有人有想法os
可以变成None
?我是不是能够模拟这种不使用全局变量名称os
和function_one
...
答
如果你有你的PYTHONPATH名为OS另一个模块,它可以得到进口替代。正如人们在评论中提到的那样,另一个模块也可能是用sys.modules或导入你的模块来修改os模块。
是的,全局变量几乎是这种情况发生的唯一方式。 FWIW,如果另一个模块_imports_这个模块,他们也可以猴子修补它的全局变量来将'os'和'function_one'设置为'None' ... – mgilson 2014-10-09 14:39:55
当CPython关闭时,你会得到这种效果:它用None代替全局变量(主要是历史的)原因。从解释器关闭时运行的'__del__'方法调用函数吗? – 2014-10-09 14:42:35
您使用的是什么版本的Python?是否有代码将'None'分配给这些名称?你能展示更多的代码吗? – l04m33 2014-10-09 14:54:41