这是我的项目结构:
a
├── b.py
└── __init__.py
文件b.py
为空。
文件__init__.py
是一行:
b = 'this is a str'
然后下面的程序给出不一致的结果a.b
:
import a
print(a.b) # str
import a.b
print(a.b) # module
检测变量和文件名之间这种名称冲突的最佳方法是什么?
print(a.b)
”我想指出的是,尽管结果可能有所不同,但事实上Python在这里并没有做任何不一致的事情。无需赘述,这是程序每一步所发生的事情。
import a
Python在sys.path
其上搜索目录,直到找到以下目录之一:名为“ a.py”的文件或包含名为的文件的名为“ a”的目录__init__.py
。然后,Python将导入您的包。值得注意的是,Python不会浏览软件包“ a”并自动从中导入所有“ .py”文件(这样可以节省内存和时间)。
print (a.b)
Python的查找属性b
的a
,它发现在a
的__dict__
属性。b
is的值'this is a string'
被打印。
import a.b
Python导入您的模块。本声明中,对应于密钥的值b
中a
的__dict__
变模块对象a.b
。
print (a.b)
Python查找该属性b
。的值b
是模块对象a.b
,将被打印。
您可以编写脚本以列出包中所有模块的名称以及所有变量(本地和全局),并确定是否存在任何冲突。但是,恕我直言,在这种情况下,一盎司的预防值得一磅的治疗;Python中的良好命名约定(一种很好的资源-PEP8)是首先防止此类错误的最佳方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句