Импорт Python: будет ли изменение переменной в «потомке» менять переменную в «родителе» / других потомках? - PullRequest
2 голосов
/ 09 августа 2009

Предположим, у вас есть 3 модуля: a.py, b.py и c.py:

a.py:

v1 = 1
v2 = 2
etc.

b.py:

from a import *

c.py:

from a import *
v1 = 0

Изменит ли c.py v1 в a.py и b.py? Если нет, есть ли способ сделать это?

Ответы [ 3 ]

5 голосов
/ 09 августа 2009

Все это утверждение типа:

v1 = 0

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

Если я использую там незнакомые термины и, вероятно, так оно и есть, я настоятельно рекомендую вам прочитать отличную статью Фредрика Лунда Объекты Python: перезагрузить мозг .

2 голосов
/ 09 августа 2009

Форма from ... import * в основном предназначена для удобного интерактивного использования при подсказке переводчика: вам не рекомендуется использовать ее в других ситуациях, поскольку она не даст вам ничего, кроме проблем.

На самом деле, внутреннее руководство по стилю у моего работодателя идет дальше, рекомендуя всегда импортировать модуль, а не содержимое из модуля (модуль из пакета в порядке и на самом деле рекомендуется). В результате в нашей кодовой базе ссылки на импортированные вещи всегда являются квалифицированными именами (themod.thething) и никогда не являются голыми именами (которые всегда ссылаются на встроенные, глобальные переменные этого же модуля или локальные); это делает код намного более понятным и более читаемым, а также избегает всех видов тонких аномалий.

Конечно, если имя модуля слишком длинное, предложение as в импорте, чтобы дать ему более короткий и удобный псевдоним для целей импортирующего модуля, подойдет. Но с вашими однобуквенными именами модулей это не понадобится; -).

Итак, если вы следуете руководству и всегда импортируете модуль (а не вещи из него), c.v1 всегда будет ссылаться на то же, что и a.v1 и b.v1, и для получения, и для установки: вот одна потенциальная тонкая аномалия, которую можно избежать сразу же! -)

Запомните самый последний бит дзен Python (выполните import this в приглашении переводчика, чтобы увидеть все это):

Namespaces are one honking great idea -- let's do more of those!

Импорт всего модуля (не кусочков и кусочков внутри него) сохраняет его целостность в качестве пространства имен, как и всегда ссылки на вещи внутри импортируемого модуля с помощью точных (пунктирных) имен. Одна гудящая отличная идея: сделай больше! -)

1 голос
/ 09 августа 2009

Да, вам просто нужно правильно получить к нему доступ (и не использовать импорт *, это зло)

c.py:

import a
print a.v1 # prints 1
a.v1 = 0
print a.v1 # prints 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...