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

Я новичок в Python и программировании в целом (максимум пару недель).

Что касается Python и использования модулей, я понимаю, что функции можно импортировать с помощью from a import *.

Поэтому вместо того, чтобы печатать

a.sayHi()
a.sayBye()

я могу сказать

sayHi()
sayBye()

который, как я считаю, значительно упрощает дело. Теперь предположим, что у меня есть набор переменных, которые я хочу использовать в модулях, и все они определены в одном модуле Python. Как я могу, используя метод, аналогичный упомянутому выше, или столь же простой, импортировать эти переменные. Я не хочу использовать import a, а затем ставить перед всеми моими переменными префикс a..

Следующая ситуация была бы идеальной:

a.py

name = "Michael"
age = 15

b.py

some_function

if name == "Michael":
    if age == 15:
        print("Simple!") 

Вывод:

Simple!

person Community    schedule 05.07.2009    source источник
comment
Значительное упрощение вещей в долгосрочной перспективе окажется очень плохой идеей. Когда у вас есть более одного или двух модулей, это from module import * работает не очень хорошо.   -  person S.Lott    schedule 06.07.2009
comment
Да, я полагаю. В любом случае, это полезный трюк, где это необходимо.   -  person    schedule 06.07.2009
comment
Это в основном предназначено для крайних случаев, например, когда у вас есть базовый модуль и несколько версий для конкретной платформы, которые могут быть импортированы, которые хотят получить содержимое базы и добавить к нему. модуль os работает таким образом, выполняя, например, «импорт из nt *» или «импорт из posix *» в зависимости от платформы.   -  person ironfroggy    schedule 06.07.2009
comment
@Мистер. Ноябрь: На самом деле, это бесполезный трюк. Это удобно, когда вы находитесь в классе в течение 1 и 2 дней введения в Python. К третьему дню это уже неприемлемо, поскольку создает больше проблем, чем решает.   -  person S.Lott    schedule 06.07.2009
comment
Теперь я вижу, как from module import * может быть проблемой в большинстве программных ситуаций, но я нашел для него одно особенно удобное применение, которое не вызывает проблем. Опять же, я новичок в Python, поэтому он может оказаться совершенно устаревшим.   -  person    schedule 07.07.2009


Ответы (4)


Вы сами предложили решение: from a import * будет работать нормально. В этом отношении Python не делает различий между функциями и переменными.

>>> from a import *
>>> if name == "Michael" and age == 15:
...     print('Simple!')
...
Simple!
person Stephan202    schedule 05.07.2009
comment
КАКИЕ?? Много их! Как насчет того, чтобы объявить global name внутри функции, если эта функция хочет изменить значение name? - person bobobobo; 03.01.2010
comment
Я считаю, что это НЕ импортирует защищенные переменные, такие как _this_one. - person mareoraft; 24.05.2016
comment
Это дает мне предупреждение: из модуля import * used невозможно обнаружить неопределенные имена. - person ScottyBlades; 10.05.2020

Просто для некоторого контекста большинство линтеров будут помечать from module import * предупреждением, потому что он склонен к конфликтам пространств имен, которые вызовут головную боль в будущем.

Еще никто не заметил, что в качестве альтернативы можно использовать

from a import name, age

форме, а затем используйте name и age напрямую (без префикса a.). Форма from [module] import [identifiers] больше подходит для будущего, потому что вы можете легко увидеть, когда один импорт перекрывает другой.

Также обратите внимание, что «переменные» не отличаются от функций в Python с точки зрения того, как они адресуются — каждый идентификатор, такой как name или sayBye, указывает на какой-то объект. Идентификатор name указывает на строковый объект, sayBye указывает на функциональный объект, а age указывает на целочисленный объект. Когда вы говорите Python:

from a import name, age

вы говорите: «Возьмите те объекты, на которые указывают name и age в модуле a, и укажите на них в текущей области с теми же идентификаторами».

Точно так же, если вы хотите указать на них с разными идентификаторами при импорте, вы можете использовать

from a import sayBye as bidFarewell

форма. Указывается тот же самый функциональный объект, за исключением того, что в текущей области видимости идентификатор, указывающий на него, равен bidFarewell, тогда как в модуле a идентификатор, указывающий на него, равен sayBye.

person cdleary    schedule 06.07.2009
comment
Спасибо. Я никогда не слышал об импорте... как раньше. - person ; 07.07.2009
comment
Если ответ был для вас полезен, не стесняйтесь проголосовать за него! (По крайней мере, так говорится в подсказке. :-) - person cdleary; 07.07.2009
comment
Это было полезно, но у меня пока нет 15 репутации, а мне нужно столько, чтобы проголосовать ;_; Если бы я только мог быть здесь полезен... - person ; 08.07.2009
comment
Ах, я забыл об этом. Не беспокойтесь - я уверен, что вы найдете еще несколько хороших вопросов, чтобы задать/ответить. :-) - person cdleary; 09.07.2009
comment
как сказал @cdleary, импорт * - не очень хорошая идея, но если вам нужны все модули из библиотеки, другой альтернативой может быть импорт в самой библиотеке (например, import a), а затем использовать такие модули, как (a.get_whatever()) - person Amyth; 09.12.2012

Как говорили другие,

from module import *

также будет импортировать переменные модулей.

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

Пример: предположим, что у вас есть модуль module.py, содержащий следующий код:

a= 1
b= 2

Затем у вас есть два других модуля, mod1.py и mod2.py, которые делают следующее:

from module import *

В каждом модуле создаются два имени, a и b, указывающие на объекты 1 и 2 соответственно.

Теперь, если где-то в mod1.py присвоить глобальному имени a что-то другое:

a= 3

имя a в module.py и имя a в mod2.py по-прежнему будут указывать на объект 1.

Таким образом, from module import * будет работать, если вам нужны глобальные переменные только для чтения, но не будет работать, если вам нужны глобальные переменные для чтения и записи. Если последнее, вам лучше просто импортировать import module, а затем либо получить значение (module.a), либо установить значение (module.a= …) с префиксом модуля.

person tzot    schedule 06.07.2009

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

Если вы управляете глобальными переменными внутри функции, вы должны объявить их глобальными.

a = 10
def x():
   global a
   a = 15

print a
x()
print a

Если вы этого не сделаете, то a = 15 просто создаст локальную переменную и присвоит ей значение 15, а глобальная переменная останется равной 10.

person hasen    schedule 05.07.2009