为什么此“从栏导入*”会污染我的名称空间,而其名称在导入模块中未定义?

时间:2019-01-17 00:05:05

标签: python python-import

我以为我能理解what "import *" didits 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中导入的模块,但未在其中定义。我想念什么?

1 个答案:

答案 0 :(得分:4)

bar模块确实定义了名称datetime。声明

import datetime

datetime模块中创建模块级bar变量,并将变量绑定到datetime模块。 import *选取此名称的方式与选取其他名称的方式相同。

import *不在乎对象的创建位置。不用关心datetime模块本身是否来自其他文件。 datetime中存在一个bar名称,因此该名称被导入。