在Python中,到底做了什么import *
进口?__init__.py
在包含的文件夹中找到?
例如是否需要声明from project.model import __init__
,或者是from project.model import *
充足的?
答案
的"优点"from xyz import *
与其他形式的进口不同的是,它进口一切 (好吧,几乎…[参见下面的(a)]所有内容)从当前模块下的指定模块开始。without prefixing them with the module’s name。
>>> from math import *
>>>pi
3.141592653589793
>>>sin(pi/2)
>>>1.0
This practice (of importing * into the current namespace) is however discouraged因为它
- 提供了命名空间冲突的机会(假设您在导入之前有一个变量名称 pi)
- 如果导入的对象数量很大,效率可能会很低
- 没有明确记录变量/方法/类的起源(最好有程序的"自我文档"以供将来访问代码)
因此,通常我们将这种导入*实践限制为临时测试等。设计的 导入import *
。
explicitly import a few objects only
>>>from math import pi
>>>pi
>>>3.141592653589793
>>> sin(pi/2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'sin' is not defined
或者import the module under its own namespace(或其别名,特别是如果这是一个长名称,并且程序多次引用其对象)
>>>import math
>>>math.pi
>>>3.141592653589793
etc..
>>>import math as m #bad example math being so short and standard...
>>>m.pi
>>>3.141592653589793
etc..
请参阅Python documentation on this topic
(a) Specifically, what gets imported with from xyz import *
?
如果 xyz 模块定义了__all__
变量,它将导入此序列中定义的所有名称,否则它将导入所有名称,除了以下划线开头的名称。
Note 许多图书馆都有sub-modules 。urllib
包括子模块,例如urllib.request
,urllib.errors
,urllib.response
等等。一个常见的混淆点是
from urllib import *
将导入所有这些子模块。That is NOT the case :需要单独显式导入这些,例如,from urllib.request import *
等等。顺便说一下,这并不特定于import *
, 清楚的import
也不会导入子模块(但是当然,*
这通常是简写*“一切”*可能会误导人们认为所有子模块和其他所有内容都会被导入)。