Подтвердить что ты не робот

Разница между "import X" и "from X import"?

В Python я не совсем понимаю разницу между двумя строками кода:

import X

или

from X import *

Разве они оба не импортируют все из модуля X? Какая разница?

4b9b3361

Ответ 1

После import x, вы можете ссылаться на вещи в x как x.something. После from x import * вы можете обращаться к вещам в x напрямую как к something. Поскольку вторая форма импортирует имена непосредственно в локальное пространство имен, она создает потенциальную возможность конфликтов, если вы импортируете вещи из многих модулей. Поэтому from x import * не рекомендуется.

Вы также можете сделать from x import something команду from x import something, которая импортирует только что- something в локальное пространство имен, а не все в x. Это лучше, потому что если вы перечисляете имена, которые вы импортируете, вы точно знаете, что вы импортируете, и вам легче избежать конфликтов имен.

Ответ 2

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>}

Ответ 3

import X

Создает метку в локальном пространстве имен, которая ссылается на объект модуля.

from X import *

Создает метку для каждого атрибута элемента модуля X, непосредственно в локальном пространстве имен.

Обе операции добавляют X в sys.modules, true, но влияние на локальное пространство имен - это разница.

Ответ 4

Есть различия, некоторые простые, другие требуют больше объяснений.

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__". Это позволяет разработчикам модуля контролировать, какие функции и объекты экспортируются из своего модуля.

Ответ 5

Вы никогда не должны использовать from X import *, если не знаете, что делаете. Вы можете получить символы из модуля X, которые конфликтуют с символами другого модуля или даже вашей собственной программы. Единственное исключение, которое я получаю для этого правила, иногда from math import *.

Вы можете использовать форму from X import y, чтобы получить одну вещь из модуля.

Если вы используете форму import X, вы не только используете ядро ​​модуля X.y, но и теперь можете использовать функцию reload, если вы вносите изменения в модуль и нуждаетесь в reimport it.

Ответ 6

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

Ответ 7

Позвольте использовать это в качестве примера нашего определения модуля

def my_func():
    return 1

из импорта будет тянуть все в текущее пространство имен

from X import *
print my_func()

нормальный импорт создаст объект модуля с именем X в текущем пространстве имен

import X
print x.my_func()

Кроме того, из X import my_func может использоваться только для импорта этой функции.