在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-modulesurllib包括子模块,例如urllib.request,urllib.errors,urllib.response等等。一个常见的混淆点是

from urllib import *

将导入所有这些子模块。That is NOT the case :需要单独显式导入这些,例如,from urllib.request import *等等。顺便说一下,这并不特定于import *, 清楚的import也不会导入子模块(但是当然,*这通常是简写*“一切”*可能会误导人们认为所有子模块和其他所有内容都会被导入)。

来自: stackoverflow.com