В Python я не совсем понимаю разницу между двумя строками кода:
import X
или
from X import *
Разве они оба не импортируют все из модуля X? Какая разница?
В Python я не совсем понимаю разницу между двумя строками кода:
import X
или
from X import *
Разве они оба не импортируют все из модуля X? Какая разница?
После import x
, вы можете ссылаться на вещи в x
как x.something
. После from x import *
вы можете обращаться к вещам в x
напрямую как к something
. Поскольку вторая форма импортирует имена непосредственно в локальное пространство имен, она создает потенциальную возможность конфликтов, если вы импортируете вещи из многих модулей. Поэтому from x import *
не рекомендуется.
Вы также можете сделать from x import something
команду from x import something
, которая импортирует только что- something
в локальное пространство имен, а не все в x
. Это лучше, потому что если вы перечисляете имена, которые вы импортируете, вы точно знаете, что вы импортируете, и вам легче избежать конфликтов имен.
import X
: он импортирует все как X.var1
, X.var2
и т.д.
from X import *
: он импортирует everthing как var1
, var2
и т.д., то есть наводняет локальное пространство имен
см. разницу после двух вызовов:
>>> import math
>>> len(globals())
5 #no of variables in namespace
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'math': <module 'math' from '/usr/local/lib/python2.7/lib-dynload/math.so'>, '__package__': None}
>>>
>>>
>>> from math import *
>>> len(globals())
47 #no of variables in namespace
>>> globals()
{'pow': <built-in function pow>, 'fsum': <built-in function fsum>, 'cosh': <built-in function cosh>, 'ldexp': <built-in function ldexp>, 'hypot': <built-in function hypot>, 'acosh': <built-in function acosh>, 'tan': <built-in function tan>, 'asin': <built-in function asin>, 'isnan': <built-in function isnan>, 'log': <built-in function log>, 'fabs': <built-in function fabs>, 'floor': <built-in function floor>, 'atanh': <built-in function atanh>, 'sqrt': <built-in function sqrt>, '__package__': None, 'frexp': <built-in function frexp>, 'factorial': <built-in function factorial>, 'degrees': <built-in function degrees>, 'pi': 3.141592653589793, 'log10': <built-in function log10>, '__doc__': None, 'math': <module 'math' from '/usr/local/lib/python2.7/lib-dynload/math.so'>, 'asinh': <built-in function asinh>, 'fmod': <built-in function fmod>, 'atan': <built-in function atan>, '__builtins__': <module '__builtin__' (built-in)>, 'copysign': <built-in function copysign>, 'cos': <built-in function cos>, 'ceil': <built-in function ceil>, 'atan2': <built-in function atan2>, 'isinf': <built-in function isinf>, 'sinh': <built-in function sinh>, '__name__': '__main__', 'trunc': <built-in function trunc>, 'expm1': <built-in function expm1>, 'e': 2.718281828459045, 'tanh': <built-in function tanh>, 'radians': <built-in function radians>, 'sin': <built-in function sin>, 'lgamma': <built-in function lgamma>, 'erf': <built-in function erf>, 'erfc': <built-in function erfc>, 'modf': <built-in function modf>, 'exp': <built-in function exp>, 'acos': <built-in function acos>, 'log1p': <built-in function log1p>, 'gamma': <built-in function gamma>}
import X
Создает метку в локальном пространстве имен, которая ссылается на объект модуля.
from X import *
Создает метку для каждого атрибута элемента модуля X
, непосредственно в локальном пространстве имен.
Обе операции добавляют X
в sys.modules
, true, но влияние на локальное пространство имен - это разница.
Есть различия, некоторые простые, другие требуют больше объяснений.
import X
просто импортирует весь модуль (читает: "запускает модуль" ) и присваивает ему имя в локальной области. Имя может быть псевдонимом следующим образом: import X as Y
from X import *
по умолчанию импортирует все атрибуты модуля X
в локальную область. Вот пример различного использования:
# Assume that module `X` contains an `opendb` function
import X
X.opendb('Y')
# VS.
from X import *
opendb('Y')
Если это немного усложняется, это когда модуль определяет __all__
. Это изменяет семантику from X import *
, чтобы означать "импортировать все, что указано в свойстве __all__
". Это позволяет разработчикам модуля контролировать, какие функции и объекты экспортируются из своего модуля.
Вы никогда не должны использовать from X import *
, если не знаете, что делаете. Вы можете получить символы из модуля X, которые конфликтуют с символами другого модуля или даже вашей собственной программы. Единственное исключение, которое я получаю для этого правила, иногда from math import *
.
Вы можете использовать форму from X import y
, чтобы получить одну вещь из модуля.
Если вы используете форму import X
, вы не только используете ядро модуля X.y
, но и теперь можете использовать функцию reload
, если вы вносите изменения в модуль и нуждаетесь в reimport it.
from X import *
импортирует все элементы из модуля X
в текущее пространство имен.
import X
импортирует X, но не "объединяет" пространства имен. Например:.
Модуль X:
def foo(): pass
BAR = 12
Ваш код:
from X import *
foo() # calls X.foo
print BAR # prints 12
Или:
import X
X.foo()
print X.BAR
Позвольте использовать это в качестве примера нашего определения модуля
def my_func():
return 1
из импорта будет тянуть все в текущее пространство имен
from X import *
print my_func()
нормальный импорт создаст объект модуля с именем X в текущем пространстве имен
import X
print x.my_func()
Кроме того, из X import my_func может использоваться только для импорта этой функции.