我以为我能理解what "import *" did和its potential dangers,但显然不能。
我有:
foo.py:
from datetime import datetime
from bar import *
print(datetime.now())
bar.py:
import datetime
运行foo.py的结果是一个例外:
AttributeError:模块'datetime'没有属性'now'
datetime
是一个模块,但是datetime.datetime
是一种类型。 from datetime import datetime
使得foo.py中的datetime
引用了该类型,但是随后的from bar import *
使它再次引用了该模块。
删除from bar import *
使异常消失。
但是为什么from bar import *
用模块datetime
污染我的命名空间? datetime
是在bar
中导入的模块,但未在其中定义。我想念什么?
答案 0 :(得分:4)
bar
模块确实定义了名称datetime
。声明
import datetime
在datetime
模块中创建模块级bar
变量,并将变量绑定到datetime
模块。 import *
选取此名称的方式与选取其他名称的方式相同。
import *
不在乎对象的创建位置。不用关心datetime
模块本身是否来自其他文件。 datetime
中存在一个bar
名称,因此该名称被导入。