О структуре пакета Python - количество элементов на модуль - PullRequest
0 голосов
/ 13 февраля 2019

Есть ли объективный, сильный аргумент против наличия файла для каждой группы коррелированных модулей вместо того, чтобы упаковать их в один модуль?Например, скажем, у меня есть подпакет с именем utils, и одна из утилит, которые он предоставляет, касается ввода и вывода данных.Я имею в виду, если неправильно помещать большие функции (с их важными связанными подфункциями) в «частные» модули, а затем вызывать их, импортируя основной модуль io.

utils/
  io.py
  _pprint.py
  _ptable.py

Скажем _pprint isбольшой метод, который требует некоторых других маленьких под-методов, тогда они также были бы в модуле _pprint.py, потому что они сильно коррелированы.

В принципе, проблема в том, что у меня есть io.pyмодуль (и некоторые другие) с 20 функциями, которые трудно читать / прокручивать, чтобы найти некоторые конкретные, которые я хочу изменить.Я хотел бы иметь (в качестве примера) модуль io, который можно вызывать через import package.io, а затем внутри io.py он импортирует другие модули, связанные с вводом / выводом, или что-то в этом роде (может быть,Вместо этого мне нужно сделать это с подпакетами, чтобы использовать больше __init__.py).

1 Ответ

0 голосов
/ 13 февраля 2019

Нет, если он по-прежнему доступен для навигации, нет ничего плохого в том, чтобы иметь кучу независимых файлов.

Что касается вашего вопроса о наличии модуля "io, который можно вызывать с помощью import package.io«Способ сделать это легко - структурировать каталог:

packages -> io -> __init__.py 

. В __init__.py есть импорт для подмодулей:

__ init__.py:

from packages.io import submodule
  • Когда вызывается import packages.io, подмодулями будут атрибуты packages.io.

  • Помните, что импорт __init__.py должен быть изПерспектива основного сценария.

Выполнение этого должно дать вам макет каталогов и файлов для воспроизведения:

import os

os.makedirs("./packages/io")
with open("./main.py", 'w') as f:
    f.write("import packages.io as io\n")
    f.write("io.module1.call()\n")
    f.write("io.module2.call()\n")

with open("./packages/io/__init__.py", 'w') as f:
    f.write("from packages.io import module1\n")
    f.write("from packages.io import module2\n")

with open("./packages/io/module1.py", 'w') as f:
    f.write("def call():\n")
    f.write("\tprint('Module 1 called')")

with open("./packages/io/module2.py", 'w') as f:
    f.write("def call():\n")
    f.write("\tprint('Module 2 called')")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...