Можете ли вы создать пакет собственного пространства имен Python, в котором у вас есть модули кода непосредственно под пространством имен?

#python #package #setuptools

#python #пакет #setuptools

Вопрос:

У меня есть несколько модулей python, которые я в настоящее время упаковал из одного дерева каталогов, которое выглядит так:

 toplevel/
  setup.cfg
  setup.py
  toplevel/
    __init_.py
    a.py
    b.py
    c.py
    ...
 

и они импортируются чем-то вроде

 import toplevel.a
 

Потому что a.py ,b.py , и c.py у них очень разные зависимости, я бы хотел изменить это так, чтобы они находились в отдельных пакетах с отдельными зависимостями.

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

импорт toplevel.a.a

Я заставил это работать, но это не то, что я хочу. Можно ли сделать то, что я хочу, с помощью собственных пакетов пространства имен?

Ответ №1:

Мне кажется, что это невозможно (я с нетерпением жду, когда меня исправят, если это так).

Однако есть обходной путь, который, похоже, работает для меня. Если у вас есть собственная упаковка пространства имен, работающая для импорта формы

import toplevel.a.a

с каждым отдельным деревом пакетов, например

    pyproject.toml
   setup.cfg
   src
     toplevel
       a
       __init__.py
       a.py
 

тогда вместо того, чтобы иметь пустой __init.py__ файл на уровне листа, вы можете вместо этого иметь тот, который содержит

from .a import *

который затем загрузит все имена из a.py в пространство имен toplevel.a, после чего они становятся доступными через

import toplevel.a

Я нашел https://towardsdatascience.com/whats-init-for-me-d70a312da583 полезно подумать об этом.