这是我的项目结构:
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
检测变量和文件名之间的这种名称冲突的最佳方法是什么?
答案 0 :(得分:5)
print(a.b)
”我想指出,虽然结果可能不同,但实际上,Python并没有做任何不一致的事情。没有详细介绍,这就是您计划中每一步所发生的事情。
import a
Python搜索sys.path
上的目录,直到找到其中一个:一个名为“a.py”的文件,或一个名为“a”的目录,其中包含一个名为__init__.py
的文件。 Python然后imports你的package。值得注意的是,Python没有查看包“a”并自动导入所有“.py”文件(这节省了内存和时间)。
print (a.b)
Python查找b
的属性a
,它在a
的{{3}}属性中找到。 b
的值为'this is a string'
,已打印。
import a.b
Python导入您的模块。使用此语句,b
的{{1}}中与键a
对应的值将成为模块对象__dict__
。
a.b
Python查找属性print (a.b)
。 b
的值是模块对象b
,它是打印的。
您可以编写一个脚本来列出程序包中所有模块的名称,以及所有变量(本地和全局),并确定是否存在任何冲突。然而,恕我直言,在这种情况下,一盎司的预防值得一磅治疗; Python中的良好命名约定(一个很好的资源 - __dict__
)是首先阻止这样的错误的最好方法。