Пакеты "внутри" модулей - PullRequest
       9

Пакеты "внутри" модулей

5 голосов
/ 08 ноября 2011

У меня растет число сценариев, которые составляют программу, которую я пишу, и решил, что пришло время очистить дерево исходных текстов и правильно их упаковать.Я уверен, что это простой вопрос, но я не могу выяснить, как это сделать.

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

Например, скажем, я хотел иметь возможность import mystuff и получить все мои вещи.но я также должен быть в состоянии import mystuff.test.test1.Я думал, что создам исходное дерево, например,

myprogram/
    mystuff.py
    mystuff/
        __init__.py
        tests/
            __init__.py
            test1.py
            test2.py
            ...

Но в этом случае кажется, что mystuff/ всегда имеет приоритет над mystuff.py, поэтому import mystuff ничего не делает (до тех пор, пока mystuff/ 's __init__.py пусто).

Каков будет правильный подход для получения желаемого поведения?Или это невозможно, и я должен переместиться mystuff.py в mystuff/ и получить к нему доступ как mystuff.mystuff (кажется, это ненужное повторение).

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

Обновление. Хотя я считаю, что метод Игнасио правильный, мне не очень нравитсяЭто!Если в моем редакторе открыто несколько файлов, и все они называются __init__.py, все может стать грязным.Итак, я решил оставить свою структуру такой, какая она есть, и связать mystuff.py с mystuff/__init__.py.Если у кого-то есть мнение о том, почему я не должен этого делать, я бы хотел их услышать.

На самом деле, в конце концов, я делаю ссылки наоборот, так как я не смог найти способ сделать символические ссылки разыменования distutils при создании tar.gz, и в результате я получил неработающие ссылки вмой вывод.Этот способ имеет тот же эффект и сохраняет его счастливым.

Ответы [ 2 ]

4 голосов
/ 09 ноября 2011

У вас не может быть и пакета mystuff.py, и mystuff/.

У вас есть два варианта:

  • введите код mystuff.py в mystuff/__init__.py
  • переименуйте mystuff.py, например, в mystuff/_stuff.py, а затем импортируйте его в mystuff/__init__.py.

Второй вариант выглядит примерно так:

myprogram/
    mystuff.py -------
    mystuff/           \
        __init__.py    /
        _stuff.py <---
        tests/
            __init__.py
            test1.py
            test2.py
            ...

и mystuff/__init__.py выглядит так:

from mystuff._stuff import *
4 голосов
/ 08 ноября 2011

Все в mystuff.py должно быть помещено в mystuff/__init__.py.

...