2016-07-21 2 views
1

У меня есть модуль test.py следующим образом:Как именно из ... импорт ... работает?

def a(): 
    return "Hey!" 

def b(): 
    return a() 

В другом модуле, я импортировал функцию b следующим образом:

from test import b 

Теперь, когда я print b() во втором модуле, я получаю Hey! как выход. Но, учитывая, что я импортировал только функцию b, а не a, я ожидал, что NameError.

Задает ли оператор from x import y все зависимые функции и переменные от y от x?

+1

Единственное отличие между двумя утверждениями заключается в том, какое имя связано; import test связывает тест имени с модулем (например, test -> test.modules ['test']), тогда как из test import 'b' связывает другое имя, b, указывая прямо на атрибут, содержащийся внутри модуля (Например, b -> test.modules ['test']. B). Остальная часть тестового модуля все еще существует, проверьте эту ссылку [Проверить эту ссылку] (http://programmers.stackexchange.com/questions/187403/import-module-vs-from-module-import-function/187471) – Vaibhav

ответ

0
from test import b 

Это не импортирует любой другой функции, кроме b от test. Это просто делает функцию b() доступной вашему текущему модулю. Но если вы используете

import test

тогда все функции из test будут доступны для вас. Итак, теперь вы можете вызвать любую функцию из test в ваш текущий модуль.

Лучший способ - использовать globals() в вашем текущем модуле. В первом случае (т.е. from test import b), globals() покажет функцию b от модуля test, что означает, что вы имеете доступ к ТОЛЬКОb метод из test.

Но, в более позднем (т.е. import test), globals() покажет модуль test самих, вместо функции b. Таким образом, у вас есть доступ ко всему модулю test и все его методы.

Возможно, вы найдете this blog.

Смежные вопросы