Python变量和文件名冲突
这是我的项目结构:Python变量和文件名冲突,python,Python,这是我的项目结构: a ├── b.py └── __init__.py 文件b.py为空 文件\uuuu init\uuuu.py是一行: b = 'this is a str' 然后,以下程序给出了不一致的a.b: import a print(a.b) # str import a.b print(a.b) # module 检测变量和文件名之间此类名称冲突的最佳方法是什么?“以下程序给出了不一致的打印结果(a.b)” 我想指出的是,虽然结果可能不同,但实际上Pyt
a
├── b.py
└── __init__.py
- 文件
为空b.py
- 文件
是一行:\uuuu init\uuuu.py
b = 'this is a str'
a.b
:
import a
print(a.b) # str
import a.b
print(a.b) # module
检测变量和文件名之间此类名称冲突的最佳方法是什么?“以下程序给出了不一致的打印结果(a.b)
”
我想指出的是,虽然结果可能不同,但实际上Python并没有做任何不一致的事情。下面是您的程序中每一步发生的情况,不需要太多细节
导入一个
Python搜索sys.path
上的目录,直到找到其中一个:一个名为“a.py”的文件,或者一个名为“a”的目录,其中包含一个名为\uuu init\uuuu.py
的文件。Python然后是您的。值得注意的是,Python不会检查包“a”并自动从中导入所有“.py”文件(这节省了内存和时间)
打印(a.b)
Python查找a
的属性b
,它在a
的属性中找到该属性。b
的值是打印的'这是一个字符串'
导入a.b
Python导入您的模块。通过此语句,与a
的\uuuu dict\uuuuu
中的键b
对应的值成为模块对象a.b
打印(a.b)
Python查找属性b
。b
的值是打印的模块对象a.b
“检测这种名称冲突的最佳方法是什么?”
您可以编写一个脚本,列出包中所有模块的名称以及所有变量(本地和全局),并确定是否存在冲突。然而,在这种情况下,一盎司的预防抵得上一磅的治疗;Python中良好的命名约定(一个很好的资源-)首先是防止此类错误的最佳方法