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

我想我明白了什么是“进口*”做了和它的潜在危险,但显然不是。


我有:


foo.py:


from datetime import datetime

from bar import *

print(datetime.now())

酒吧.py:


import datetime

运行 foo.py 的结果是一个异常:


AttributeError: 模块“datetime”没有属性“now”


datetime是一个模块,但是datetime.datetime是一个类型。from datetime import datetime使其datetime在 foo.py 中引用类型,但随后from bar import *以某种方式使其再次引用模块。


删除from bar import *使异常消失。


但是为什么from bar import *模块会污染我的命名空间datetime?datetime是一个导入到 中的模块bar,但它没有在那里定义。我错过了什么?


千巷猫影
浏览 186回答 1
1回答

白衣染霜花

该bar模块确实定义了一个 name datetime。该声明import datetime在模块中创建模块级datetime变量bar并将变量绑定到datetime模块。import *以获取其他名称的相同方式获取此名称。import *不关心对象是在哪里创建的。它不在乎datetime模块本身来自其他文件。中datetime存在名称bar,以便导入该名称。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python