Как получить доступ к переменной, объявленной в файле инициализации пакета, когда мы используем «из модуля импорта package.subpackage»? - PullRequest
0 голосов
/ 17 октября 2019

Когда мы используем from package.subpackage import module, как мы можем получить доступ к пакету и подпакету init файловые переменные из вызывающего модуля?

Предполагая, что varname является именем переменной в __init__ file как из package, так и package.subpackage, как мы можем получить к ним доступ в вызывающем модуле? Пример:

  • package.varname
  • package.subpackage.varname

Я знаю, что если бы мы использовали 'import package.subpackage.module', то вышевозможно, но я получаю имя не определено ошибка, когда я пытаюсь сделать то же самое, используя подход from pkg.subpkg import mod, поскольку пакет не находится в локальном пространстве имен (только модуль).

1 Ответ

3 голосов
/ 17 октября 2019

Если переменная с именем varname определена в модуле __init__.py пакета с именем package, то мы можем получить доступ к varname следующим образом:

from package import varname
print(varname)

Аналогично,если переменная с именем varname определена в модуле __init__.py подпакета с именем subpackage пакета с именем package, то мы можем получить доступ к varname следующим образом:

from package.subpackage import varname
print(varname)

Чтобы получить доступ к ним обоим одновременно, мы должны позаботиться о конфликте имен:

from package import varname as package_varname
from package.subpackage import varname as package_subpackage_varname
print(package_varname)
print(package_subpackage_varname)

Кроме того, __init__.py позволяет нам определять любую переменную на уровне пакета. Это часто удобно, если модуль определяет что-то, что будет часто импортироваться. Этот шаблон способствует приверженности философии Pythonic flat is better than nested.

Пример:

Предположим, что структура нашего проекта выглядит следующим образом:

/project
  - __init__.py
  - file1.py

И наша file1.py выглядит так:

message = 'hi there'

Тогда мы можем получить к нему доступ как:

from project.file1 import message
print(message)

Теперь, чтобы сделать его доступным, как:

from project import message

В __init__.py мы можем сделать:

from .file1 import message

__all__ = ['message']
...