为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

千巷猫影 2021-10-12 17:52:38
我想我明白了什么是“进口*”做了和它的潜在危险,但显然不是。我有:foo.py:from datetime import datetimefrom 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,但它没有在那里定义。我错过了什么?
查看完整描述

1 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

bar模块确实定义了一个 name datetime。该声明

import datetime

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

import *不关心对象是在哪里创建的。它不在乎datetime模块本身来自其他文件。中datetime存在名称bar,以便导入该名称。


查看完整回答
反对 回复 2021-10-12
  • 1 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信