究竟是什么“进口*”进口?究竟是什么“进口*”进口?(What exactly does “impo

2019-05-09 04:28发布

在Python中,究竟是什么import *进口? 是否导入__init__.py含有文件夹中发现了什么?

例如,是否有必要宣布from project.model import __init__ ,或者是from project.model import *是否足够?

Answer 1:

的“优势” from xyz import *相对于其他形式进口的是,它进口的一切 (当然,几乎... [见(a)所示]的所有内容)从当前模块下指定的模块。 这允许使用来自导入模块的各种对象(变量,类,方法......) 不与模块的名称为前缀来 。 例如

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

然而,这种做法(进口的*到当前的命名空间)不提倡 ,因为它

  • 提供了机会,命名空间冲突(比方说,如果你有导入​​之前的一个变量名PI)
  • 可能是低效的,如果是进口对象的数量大
  • 并没有明确的文件变量/方法/类的起源(它是好的,有计划的对未来的此次访问“自文档”到代码)

通常,我们因此限制了这种导入*的做法即席测试等。 正如@指出德尼尔森-SA-马亚,某些库,如(例如pygame的)有一个子模块,其中所有最常用的常量和函数定义并这样的子模块被有效地设计成与进口import * 。 除了这些特殊的子模块,它是否则最好...:

明确只导入几个对象

>>>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文档

(一)具体的,能与进口from xyz import *
如果XYZ模块限定了__all__变量,它将导入该序列中定义的所有名字,否则将导入的所有名字,除了这些与下划线开头。

注意:许多图书馆有子模块 。 例如,标准库urllib包括子模块,如urllib.requesturllib.errorsurllib.response等混乱的共通点在于

from urllib import *

将导入所有这些子模块。 这是不是这样的 :一个需要明确地导入这些分别用,比方说, from urllib.request import *等,这顺便说一句不是特定于import * ,纯import将不会导入子模块要么(当然,在*这一点常常是“一切”的简写可能误导人们以为所有子模块和其他一切将被导入)。



Answer 2:

它进口(到当前的命名空间)的所有命名的模块(或包)列出了它的__all__属性-缺少这样的属性,不以开头的所有姓名_

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

我的建议,每个谷歌的Python的风格指南 ,是从模块中永远只能导入模块而不是类或函数(或其他名称)。 严格按照这个做的清晰度和精确度,并避免了微妙的陷阱可能会当你“从一个模块内的东西”导入。

导入包(或里面的任何东西)本质上加载并执行包的__init__.py -该文件定义的包体。 然而,这并不名字绑定__init__在当前的命名空间(所以在这个意义上,它不会导入名)。



Answer 3:

是的,它确实。 它进口的一切 (这不是一个私有变量,即:变量,其名称开始___ ),你应该尽量不要按“使用Python中正确导入模块 ”,以避免污染当地的命名空间。

这是不够的,但通常你应该要么import project.model ,已经进口__init__.py ,每个“ 了解蟒蛇进口 ”,但可以得到,如果你使用太多或太罗嗦import project.model as pmimport project.model as model以后节省当你用它敲几下键盘。

按照亚历克斯在“建议究竟做‘进口*’进口? ”



Answer 4:

如果project.model是一个包,通过提到的模块import project.model.../project/model/__init__.pyfrom project.model import *转储一切从__init__.py的命名空间到你的。 它不会自动做模型中的其它模块什么。 首选风格是__init__.py不包含任何数据。

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



Answer 5:

如果有问题(模块project.model你的情况)定义了一个名为蜇伤的列表__all__ ,然后在列表中的每个命名的变量是进口的。 如果没有这样的变量,它进口的一切。



Answer 6:

这里是一个很好的方式,看看有什么星/星号(*)已经从一个模块的输入:

before = dir()
from math import *
after = dir()
print(set(after) - set(before))

收益:

{'modf', 'pow', 'erfc', 'copysign', 'sqrt', 'atan2', 'e', 'tanh', 'pi', 'factorial', 'cosh', 'expm1', 'cos', 'fmod', 'frexp', 'log', 'acosh', 'sinh', 'floor', 'isclose', 'lgamma', 'ceil', 'gcd', 'ldexp', 'hypot', 'radians', 'atan', 'isnan', 'atanh', 'before', 'isinf', 'fabs', 'isfinite', 'log10', 'nan', 'tau', 'acos', 'gamma', 'asin', 'log2', 'tan', 'degrees', 'asinh', 'erf', 'fsum', 'inf', 'exp', 'sin', 'trunc', 'log1p'}

我用我自己的模块工作,明确进口一切,但东西向进口名单是越来越太长。 于是,只好用这种方法来获得的东西*进口了名单。



文章来源: What exactly does “import *” import?