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