Python变量和文件名冲突

Cyk*_*ker 5 python

这是我的项目结构:

a
??? b.py
??? __init__.py
Run Code Online (Sandbox Code Playgroud)

然后,以下程序给出了不一致的结果a.b:

import a
print(a.b)    # str
import a.b
print(a.b)    # module
Run Code Online (Sandbox Code Playgroud)

检测变量和文件名之间这种名称冲突的最佳方法是什么?

Dan*_*iel 5

"以下程序给出了不一致的结果print(a.b)"

我想指出,虽然结果可能不同,但事实上,Python并没有做任何不一致的事情.没有详细介绍,这就是程序中每一步所发生的事情.

import a

Python搜索目录,sys.path直到找到其中一个:一个名为"a.py"的文件,或一个名为"a"的目录,其中包含一个名为的文件__init__.py.然后Python 导入你的.值得注意的是,Python没有查看包"a"并自动从中导入所有".py"文件(这节省了内存和时间).

print (a.b)

Python查找它在属性ba找到a__dict__属性.bis 的值'this is a string'是打印的.

import a.b

Python导入你的模块.使用此语句,与s ba的键对应的值将__dict__成为模块对象a.b.

print (a.b)

Python查找属性b.值的值是打印b的模块对象a.b.

"检测这种名称冲突的最佳方法是什么?"

您可以编写一个脚本来列出包中所有模块的名称,以及所有变量(本地和全局),并确定是否存在任何冲突.然而,恕我直言,在这种情况下,一盎司的预防值得一磅治疗; Python中的良好命名约定(一个很好的资源 - PEP8)是防止这样的错误的最佳方法.