Python: я могу импортировать пространство имен модуля в самом модуле?

1

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

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

import server

bar = 5

def foo():
   server.bar = 10
  • 0
    Вы не хотите только доступ, вы хотите изменить их. Тогда, естественно, возникает вопрос: почему вы хотите действовать таким образом, а не с использованием global утверждения, которое точно предназначено для этого?
  • 0
    Вы используете слово «переменная» неверно. Существуют переменные в других языках, слово берется в смысле куска памяти, действующего как коробка, содержание которой может меняться , но не в Python. В Python нет box-переменных, все является объектом . Единственное приемлемое использование слова «переменная» в Python - это обозначение имени объекта, единственное значение, которое я видел в официальных документах. Но есть определенное слово для этого: «идентификатор». Поэтому нет смысла использовать неоднозначное и запутанное слово «переменная» в контексте Python.
Показать ещё 1 комментарий
Теги:
scope
python-module

4 ответа

5
Лучший ответ

Вместо использования 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 вы имеете в виду.

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

# 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 как указано выше, или вы будете рекурсивно.

  • 0
    +1 за неиспользование глобала!
  • 0
    Поэтому вместо того, чтобы явно указывать на использование глобальных переменных, вы предлагаете скрыть их и полагаться на неявные механизмы. Я склонен считать это вредным советом.
Показать ещё 1 комментарий
1

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

def foo():
    global bar
    bar = 10

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

  • 0
    Это неправильно, вы можете импортировать это так (но не так).
  • 0
    Технически вы можете, но вы можете получить действительно странные результаты, делая это. Таким образом, вы не можете сделать это и ожидать, что это будет работать на 100% надежно.
Показать ещё 3 комментария
1

Почему нет:

def foo():
  global bar
  bar = 10
0

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

def foo():
    global bar
    bar = 10

Ещё вопросы

Сообщество Overcoder
Наверх
Меню