究竟是什么“导入*”导入?

在Python中, import * import是什么? 它是否导入在包含文件夹中find__init__.py

例如,是否需要from project.model import __init__ ,或者是from project.model import *足够?

与其他forms的导入相比, from xyz import *的“优势”是from xyz import *当前模块下的指定模块中导入一切 (几乎…(参见下面的(a)))。 这允许使用导入模块中的各种对象(variables,类,方法…), 而不用在模块的名称前加前缀 。 例如

 >>> from math import * >>>pi 3.141592653589793 >>>sin(pi/2) >>>1.0 

这种做法(将*导入到当前命名空间中)是不鼓励的,因为它

  • 提供了命名空间冲突的机会(例如,如果在导入之前有一个variables名称pi)
  • 如果导入的对象数量很大,可能效率不高。
  • 没有明确地loggingvariables/方法/类的起源(很高兴有这个程序的“自我文档”以供将来访问代码)

因此,我们通常将这种导入*实践限制在临时testing等之中,取而代之的是:

只显式导入一些对象

 >>>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 math >>>math.pi >>>3.141592653589793 etc.. >>>import math as m #bad example math being so short and standard... >>>m.pi >>>3.141592653589793 etc.. 

请参阅关于此主题Python文档

(a)具体来说, from xyz import *
如果xyz模块定义了一个__all__variables,它将会导入在这个序列中定义的所有名字,否则它将会导入所有的名字,除了那些以一个下划线开头的名字。

它将模块(或包)在其__all__属性中列出的任何名称(到当前名称空间中)导入 – 缺less这样的属性,所有不以_开头的名称。

它主要是作为一个方便的快捷方式,只能在交互式解释器会话中使用:正如其他答案所build议的, 不要在程序中使用它。

根据Google的Python风格指南 ,我的build议是只从模块中导入模块而不是类或函数(或其他名称)。 严格遵循这一点使得清晰和精确,并避免了当你从模块中导入“东西”时可能出现的细微陷阱。

导入一个包(或其中的任何东西)会内在地加载和执行包的__init__.py – 该文件定义包的主体。 但是,它不会绑定当前命名空间中的名称__init__ (所以在这个意义上它不会导入该名称)。

是的,它确实。 它会导入所有东西 (不是私有variables,即:名称以___开头的variables),您应该尽量不要根据“ 在Python中正确导入模块 ”来使用它,以避免污染本地名称空间。

这已经足够了,但是通常你应该执行import project.model ,它已经通过“ Understanding python imports ”导入了__init__.py ,但是如果你使用得太多,或者import project.model as pmimport project.model as model以便稍后保存一些击键。

按照Alex的build议,“ 究竟是什么”导入*“导入? ”

如果project.model是一个包,则import project.model引用的模块来自.../project/model/__init__.pyfrom project.model import *将所有从__init__.py的命名空间转换为你的。 它不会自动对模型中的其他模块做任何事情。 首选样式是__init__.py不包含任何内容。

永远不会永远使用import * 。 它使你的代码不可读,不可维护。

如果有问题的模块(您的案例中的project.model )已经定义了名为__all__列表,那么该列表中的每个命名variables都将被导入。 如果没有这样的variables,它会导入一切。