Какова концепция пространства имен при импорте функции из другого модуля? - PullRequest
0 голосов
/ 18 октября 2019

main.py:

from module1 import some_function
x=10
some_function()

module1.py:

def some_function():
    print str(x)

Когда я выполняю main.py, в moduel1.py выдается ошибка, указывающая, что xнедоступно.

Насколько я понимаю, использование from x import y в модуле main.py дает определение / значение xy в локальном пространстве имен main.py. И поскольку определение функции и переменная x находятся в локальном пространстве имен main.py, все должно работать нормально. Но это кажется неправильным прослеживанием. Так что же здесь такое? Любая ссылка на официальную документацию Python для этой концепции?

Ответы [ 2 ]

1 голос
/ 18 октября 2019

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

Посмотрите на этот модуль:

def some_function():
    print str(x)

Он не определяет x, поэтому имя не существует в этом модуле. Если вы определите x в другом модуле, он все равно не будет существовать в этом модуле. Даже если вы импортируете этот модуль в другой модуль, который определяет x, x все равно не будет существовать в этом модуле.

Там нет "глобального global" пространства имен. Каждый модуль имеет свое собственное пространство имен global. Имена никогда не делятся неявно между модулями, они всегда должны быть явно импортированы.

Единственное исключение из этого - builtins, которое - для удобства - не нужнобыть явно импортированным.

1 голос
/ 18 октября 2019

Каждый модуль имеет собственное глобальное пространство имен.

from module1 import some_function
x=10
some_function()

some_function использует module1.x в своем определении, но вы устанавливаете x в текущий модуль. Это будет работать:

from module1 import some_function
import module1

module1.x = 10
some_function()

Обратите внимание, что вы не можете использовать from module1 import x, затем установите x = 10, потому что import просто инициализирует новое имя x дляимеют то же начальное значение, что и module1.x;x = 10 затем дает новое значение новой переменной.

...