我以为我理解"import *"的作用及其潜在危险,但显然不是。
我有:
foo.py:
from datetime import datetime
from bar import *
print(datetime.now())
bar.py:
import datetime
运行 foo.py 的结果是一个异常:
属性错误:模块"日期时间"没有属性"现在"
datetime
是一个模块,但datetime.datetime
是一个类型。 from datetime import datetime
使 foo.py 中的datetime
引用类型,但随后的from bar import *
以某种方式使其再次引用模块。
删除from bar import *
会使异常消失。
但是为什么from bar import *
用模块datetime
污染我的命名空间? datetime
是 bar
中导入的模块,但未在此处定义。我错过了什么?
bar
模块确实定义了一个名称datetime
。声明
import datetime
在bar
模块中创建模块级datetime
变量,并将该变量绑定到datetime
模块。 import *
选取此名称的方式与选取其他名称的方式相同。
import *
不关心对象的创建位置。它不在乎datetime
模块本身是否来自其他文件。bar
中存在一个datetime
名称,因此该名称被导入。