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

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

丹尼尔

“以下程序给出的结果不一致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导入您的模块。本声明中,对应于密钥的值ba__dict__变模块对象a.b

print (a.b)

Python查找该属性b的值b是模块对象a.b,将被打印。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章