Как можно импортировать модуль / функцию? - PullRequest
0 голосов
/ 12 декабря 2018

Это очень простой вопрос, но я пока не видел объяснений, охватывающих все возможные случаи.

Предположим, m1, m2, m3 - это иерархии модулей, а fun() - это функция внутри иерархии.

Я видел такие команды, как

Версия 1

from m1.m2.m3 import fun
fun() #To access the function

Версия 2

import m1
m1.m2.m3.fun()

Они точно эквивалентны

Версия 3

import m1.m2
m1.m2.m3.fun()

или

Версия 4

from m1.m2 import m3
m3.fun()

или любая другаякомбинации между ними?Есть ли относительные преимущества или недостатки?Ясно, что я предпочел бы писать fun() при вызове функции каждый раз, а не писать m1.m2.m3.fun(), но в чем смысл?
Насколько я понимаю, версия 2 выполнит весь сценарий m1.Но другие более избирательны в своем исполнении (и, следовательно, возможно, доберутся до __main__ быстрее?)

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Версия 1

from m1.m2.m3 import fun
fun() #To access the function

Версия 1 подходит для , если fun - единственная необходимая функция из дерева m1 и вы можете гарантировать, что никакая другая функция внутри вашего скрипта никогда не будет вызываться fun.Если что-либо из перечисленного не удовлетворено , не делайте этого , но если есть, сделайте это.


Версия 2

import m1
m1.m2.m3.fun()

Версия 2 подходит для , если вы хотите иметь доступ к всему внутри m1.Это приводит к большему количеству подробного кода, потому что вы должны все время носить с собой m1, но это безопаснее и гораздо менее очевидно, чем эквивалент (который не следует поощрять) from m1 import *.Обратите внимание, что будет выполнен код m1.


Версия 3

import m1.m2
m1.m2.m3.fun()

Версия 3 - это та, которая должна идти с , если вы хотите иметь доступ к всему внутри m2, но не выше (не можете m1.more_fun()).Обратите внимание, что будет выполнен код m2.


Версия 4

from m1.m2 import m3
m3.fun()

Версия 4 - это та, к которой следует добавить , если вы хотите иметь доступ к всему внутри m3, но не выше (не можете m1.m2.more_fun()).Обратите внимание, что код m3 будет выполнен.

0 голосов
/ 12 декабря 2018

еще один способ импорта -

import m1.m2.m3 as m

, и, следовательно, вы можете вызывать функцию, используя

m.fun()

. Наиболее важная вещь, которую следует соблюдать при импорте, - это не переопределять то, что ужесуществует (загрязняет пространство имен)

...