Ответ 1
Вы сами дали решение: from a import *
будет работать нормально. В этом отношении Python не делает различий между функциями и переменными.
>>> from a import *
>>> if name == "Michael" and age == 15:
... print('Simple!')
...
Simple!
Я новичок в 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!
Вы сами дали решение: from a import *
будет работать нормально. В этом отношении Python не делает различий между функциями и переменными.
>>> from a import *
>>> if name == "Michael" and age == 15:
... print('Simple!')
...
Simple!
Только для некоторого контекста большинство линтеров будут отмечать 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
.
Как и другие,
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= …
) с префиксом модуля.
Вы не сказали этого напрямую, но я предполагаю, что у вас возникают проблемы с манипулированием этими глобальными переменными.
Если вы манипулируете глобальными переменными изнутри функции, вы должны объявить их глобальными
a = 10
def x():
global a
a = 15
print a
x()
print a
Если вы этого не сделаете, то a = 15
будет просто создавать локальную переменную и назначать ее 15, тогда как глобальная a останется 10