Python: могу ли я импортировать пространство имен модуля внутри самого модуля? - PullRequest
1 голос
/ 17 августа 2011

Поскольку имена переменных объявляются локальными, если им присваивается назначение внутри функции, и я хочу получить доступ к переменным модуля из функции, могу ли я импортировать имя модуля в модуле, а затем использовать его для доступа к модулю переменные?

Пример (имя файла: server.py):

import server

bar = 5

def foo():
   server.bar = 10

Ответы [ 4 ]

5 голосов
/ 17 августа 2011

Вместо использования оператора global, как предлагается во всех других ответах, не используйте переменные уровня модуля, а используйте класс в качестве контейнера или другой модуль только для глобальных переменных:

# mg.py

bar = 5

# server.py
import mg

def foo():
    mg.bar = 10

или

class mg:
    bar = 5

def foo():
    mg.bar = 10

Таким образом, вам не нужно помещать global операторов везде, вы можете использовать эти имена повторно, и становится ясно, на какой bar вы ссылаетесь.

Редактировать: Также можно импортировать модуль внутри себя, но вы не можете изменить переменные в основном модуле таким образом. Так что это будет работать:

# selfimport.py
import selfimport

def foo():
    print selfimport.foo

bar = 3

if __name__ == '__main__':
    print selfimport.bar
    foo()

Но это не будет:

# selfimport.py
import selfimport

bar = 3

def foo():
    selfimport.bar = 5

if __name__ == '__main__':
    print selfimport.bar
    foo()
    print bar # bar is still 3!

Если вы используете глобальные переменные только в качестве констант, вам все равно не понадобится оператор global. Вам также необходимо убедиться, что код, который вы хотите выполнить только в главном модуле, обернут в оператор if, как указано выше, иначе вы будете повторяться.

1 голос
/ 17 августа 2011

Почему бы и нет:

def foo():
  global bar
  bar = 10
1 голос
/ 17 августа 2011

Вы не можете импортировать это так, и вам не нужно. Просто используйте переменную module-global напрямую.

def foo():
    global bar
    bar = 10

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

0 голосов
/ 17 августа 2011

нет, вместо этого используйте глобальный оператор:

def foo():
    global bar
    bar = 10
...