Краткий ответ: нет, это невозможно, и вам придется использовать префикс.
Важно понимать, что from foo import x, y
- это копирование x
в ваше пространство имен. Это эквивалентно:
import foo
# COPY TO YOUR NAMESPACE
x = foo.x
y = foo.y
# `from foo import` does NOT leave `foo` in your namespace
def foo
Таким образом, каждый модуль получит локальную копию x
и y
. Изменение x
не будет видно в других модулях, и вы не увидите изменений, которые делают другие модули: - (
Чтобы изменить центральную копию переменной, вы должны импортировать сам модуль: import foo
и изменить foo.x
. Таким образом, существует только одна копия, и все получают к ней доступ: -)
[В связанных вопросах также упоминается возможность поместить переменную общего доступа в модуль встроенный . DO NOT! Это исключило бы префикс для чтения, но не для записи, и это очень плохой стиль.]
Записка в защиту Python
Если вы не согласны с необходимостью использовать префикс foo.
здесь, вы, вероятно, также не согласитесь с необходимостью использования префикса self.
для доступа к переменным объекта. Суть в том, как работает Python - поскольку вы не объявляете переменные, нет другого выбора, кроме как использовать префиксы.
Но есть и плюс: читая код на Python, вы легко видите, где находится каждая переменная. ИМХО, это очень хорошо.
Подтверждающие доказательства: в других языках, таких как C ++ / Java, многие люди соблюдают соглашения, такие как префикс m_
для всех имен переменных объекта, для достижения аналогичного эффекта ...
Замечания по стилю
Вам не нужно import foo as bar
, просто используйте import foo
.
Форма as
не делает ничего нового, она просто переименовывает ее, что просто сбивает с толку.
Это полезно, только если «foo» очень длинное имя; особенно принят случай, когда «foo» живет глубоко в некотором пакете, поэтому вы можете сделать import long.package.foo as foo
.
from foo import *
считается очень плохим стилем в программах, потому что:
Человек, читающий ваш код, не будет знать, откуда пришли имена.
Он загрязняет ваше пространство имен, что может привести к незначительным ошибкам, когда имена из
столкновение разных модулей.
Явная форма from foo import x, y
в порядке, но начинает страдать от тех же проблем, если вы используете много имен из модуля.
В таких случаях лучше всего import foo
и явно написать foo.x
, foo.y
.
Итог: в случае сомнений лучше всего просто import foo
.
Исключение: очень удобно использовать import *
при экспериментах с интерактивным переводчиком. Однако обратите внимание, что он не очень хорошо работает с reload()
, поэтому не используйте его при отладке изменяющегося кода. (Для отладки модуля, который вы пишете, лучше всего запустить новый интерпретатор внутри пространства имен модуля - python -i mymodule.py
/ F5 в IDLE.)