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中良好的命名约定(一个很好的资源-)首先是防止此类错误的最佳方法