область видимости глобальных переменных в модулях - PullRequest
0 голосов
/ 04 января 2019

Резюме:

В зависимости от того, как определена функция - локально или в модуле, и от того, как модуль импортирован, - область действия глобальных переменных различается. i) я хотел бы понять это и ii) я ищу способ, чтобы область действия некоторых переменных, определенных в модуле, была глобальной для всего процесса.

Для иллюстрации проблемы:

1) Создайте модуль с именем MyModule.py с таким содержимым:

def MyFunctionInModule():
    global gvar2
    gvar2 = "global var 2"
    print gvar2 + " from MyFunctionInModule"
    print gvar3 + " from MyFunctionInModule"
    return

и поместите его в путь поиска модуля.

2) В командной строке интерпретатора Python введите:

def MyFunction():
    global gvar1
    gvar1 = "global var 1"
    print gvar1 + " from MyFunctionInModule"
    print gvar3 + " from MyFunctionInModule"
    return

global gvar3
gvar3 = "global var 3"

(а) Это работает так, как я ожидал (т.е. gvar1 и gvar3 видны везде):

MyFunction()
print gvar1 + " at prompt"

, по результатам которого:

>>> MyFunction()  
global var 1 from MyFunctionInModule  
global var 3 from MyFunctionInModule  
>>> print gvar1 + " at prompt"  
global var 1 at prompt  

(б) Но это не работает:

import MyModule
MyModule.MyFunctionInModule() # gvar3 is not defined
print gvar2 + " at prompt" # gvar2 is not defined

, для которых получены следующие результаты:

>>> MyModule.MyFunctionInModule() # gvar3 is not defined
global var 2 from MyFunctionInModule
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "MyModule.py", line 5, in MyFunctionInModule
    print gvar3 + " from MyFunctionInModule"
NameError: global name 'gvar3' is not defined
>>> print gvar2 + " at prompt" # gvar2 is not defined
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'gvar2' is not defined

(c) Ни то, ни другое, но на меньшем уровне (т. Е. Gvar2 становится видимым):

from MyModule import *
MyFunctionInModule() # gvar3 is not defined
print gvar2 + " at prompt"

, для которых получены следующие результаты:

>>> MyFunctionInModule() # gvar3 is not defined
global var 2 from MyFunctionInModule
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "MyModule.py", line 5, in MyFunctionInModule
    print gvar3 + " from MyFunctionInModule"
NameError: global name 'gvar3' is not defined
>>> print gvar2 + " at prompt"
global var 2 at prompt  

Вопросы:

Может ли кто-нибудь объяснить (или дать ссылки на хорошую документацию, объясняющую), почему существуют такие различия в поведении между (a), (b) и (c)?

Что нужно сделать, чтобы получить то же поведение с (b) и (c), что и с (a)?

Некоторые связанные темы (но не полностью покрывающие мои потребности):
Область видимости глобальных переменных в модулях
Область видимости глобальной переменной Python

Спасибо за помощь.

1 Ответ

0 голосов
/ 04 января 2019

execfile () выполняет именно эту работу, но я не уверен, что это можно считать хорошей практикой:

execfile("MyModule.py")
global gvar3
gvar3 = "global var 3"
MyFunctionInModule()
print gvar2 + " at prompt"

Для которой получены следующие результаты:

>>> MyFunctionInModule()
global var 2 from MyFunctionInModule
global var 3 from MyFunctionInModule
>>> print gvar2 + " at prompt"
global var 2 at prompt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...