为什么这"from bar import *"使用导入模块中未定义的名称污染我的命名空间?



我以为我理解"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污染我的命名空间? datetimebar 中导入的模块,但未在此处定义。我错过了什么?

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

import datetime

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

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

最新更新