究竟是什么“导入*”导入?
在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 pm
或import project.model as model
以便稍后保存一些击键。
按照Alex的build议,“ 究竟是什么”导入*“导入? ”
如果project.model
是一个包,则import project.model
引用的模块来自.../project/model/__init__.py
。 from project.model import *
将所有从__init__.py
的命名空间转换为你的。 它不会自动对模型中的其他模块做任何事情。 首选样式是__init__.py
不包含任何内容。
永远不会永远使用import *
。 它使你的代码不可读,不可维护。
如果有问题的模块(您的案例中的project.model
)已经定义了名为__all__
列表,那么该列表中的每个命名variables都将被导入。 如果没有这样的variables,它会导入一切。