Подтвердить что ты не робот

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!
4b9b3361

Ответ 1

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

>>> from a import *
>>> if name == "Michael" and age == 15:
...     print('Simple!')
...
Simple!

Ответ 2

Только для некоторого контекста большинство линтеров будут отмечать 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.

Ответ 3

Как и другие,

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= …) с префиксом модуля.

Ответ 4

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

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

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

print a
x()
print a

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