Python变量和文件名冲突

时间:2016-03-16 11:19:59

标签: python

这是我的项目结构:

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

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

1 个答案:

答案 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__)是首先阻止这样的错误的最好方法。