Как получить родительский модуль / функции пакета в пространстве имен дочернего пакета / модуля в Python? - PullRequest
0 голосов
/ 23 апреля 2020

У меня очень сложный модуль, и я хочу разбить подпакеты на отдельные пакеты. Моя первая попытка будет для субмодуля "Утилиты". Я хочу иметь возможность импортировать все из родительского пакета example_utils.py в example_module.utils, но я также хочу, чтобы example_module.utils также имел свои собственные функции.

В конце я хочу иметь возможность сделать следующее:

import example_module as em
x = 10
y1 = em.utils.f_parent1(x)
y2 = em.utils.f_child1(x)

# and do this 
from example_module.utils import f_parent1, f_child1

# and use the parent module as a standalone
from example_utils import f_parent1, f_parent2

Как я могу структурировать свой дочерний модуль example_module, чтобы иметь эту функцию? * *

Утилиты модуля сохранены как отдельный автономный модуль example_utils.py

def f_parent1(x):
    return x

def f_parent2(x,y):
    return x+y

Этот модуль будет установлен в моей среде:

pip install path/to/example_module

Большой модуль (example_module), использующий example_utils в качестве зависимости

# Directory structure for larger Module

example_module
|++++| __init__.py
|++++| utils  
|++++| ++++ | __init__.py
|++++| ++++ | utils.py

Содержимое |++++| ++++ | __init__.py

from .utils import *

Содержимое |++++| ++++ | utils.py

from example_utils import * 

def f_child1(x):
    return x**2

Содержимое |++++| __init__.py

__version__= "0.1"
__developmental__ = True

# Utilities
from .utils import utils

# =======
# Direct Exports
# =======
_submodules = ["utils"]
__all__ = sorted(__all__)

Заранее извиняюсь, если namespace не является правильным срок. Я путаюсь с namespace, scope, et c.

1 Ответ

0 голосов
/ 01 мая 2020

С предложениями @ r-ook я обнаружил, что могу использовать getattr, чтобы получить функцию по имени строки из родительского модуля. После этого я мог бы добавить функцию в пространство имен? Scope? дочернего модуля.

example.py

from example_utils import as emu


functions_from_parent = ["f_parent1", "f_parent2"]

__all__ = {"f_child1"}

for function_name in functions_from_parent:
    globals()[function_name] = getattr(emu, function_name)
    __all__.add(function_name)
__all__ = sorted(__all__)

def f_child1(x):
    return x**2
...