Как мне создать пакет пространства имен в Python?

В псевдоклассических терминах многие лекции учат ключевое слово «this» как объект, созданный конструктором класса или объекта. Каждый раз, когда новый объект строится из класса, представьте, что под капотом создается и возвращается локальный экземпляр «этого» объекта. Я помню, как он учил так:

function Car(make, model, year) {
var this = {}; // under the hood, so to speak
this.make = make;
this.model = model;
this.year = year;
return this; // under the hood
}

var mycar = new Car('Eagle', 'Talon TSi', 1993);
// ========= under the hood
var this = {};
this.make = 'Eagle';
this.model = 'Talon TSi';
this.year = 1993;
return this;
130
задан joeforker 6 November 2009 в 02:08
поделиться

3 ответа

Есть стандартный модуль под названием pkgutil , с помощью которого вы может «добавлять» модули в заданное пространство имен.

С предоставленной вами структурой каталогов:

Package-1/namespace/__init__.py
Package-1/namespace/module1/__init__.py
Package-2/namespace/__init__.py
Package-2/namespace/module2/__init__.py

Вы должны поместить эти две строки в оба Package-1 / namespace / __ init __. py и Package-2 / namespace / __ init __. Py (*):

from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)

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

Как сказано в документации :

Это добавит к __ path __ пакета все подкаталоги каталогов на sys.path назван в честь пакета.

С этого момента вы сможете распространять эти два пакета независимо.

79
ответ дан 24 November 2019 в 00:19
поделиться

У вас есть концепции пространства имен Python, заданные задом наперед, в python нельзя помещать пакеты в модули. Пакеты содержат модули, а не наоборот.

Пакет Python - это просто папка, содержащая файл __ init __. Py . Модуль - это любой другой файл в пакете (или непосредственно в PYTHONPATH ) с расширением .py . Итак, в вашем примере у вас есть два пакета, но не определены модули. Если вы считаете, что пакет - это папка файловой системы, а модуль - это файл, тогда вы поймете, почему пакеты содержат модули, а не наоборот.

Итак, в вашем примере, предполагая, что Package-1 и Package-2 - это папки в файловой системе, которые вы поместили в путь Python, вы можете иметь следующее:

Package-1/
  namespace/
  __init__.py
  module1.py
Package-2/
  namespace/
  __init__.py
  module2.py

Теперь у вас есть одно пространство имен пакета с двумя модулями module1 и module2 . и если у вас нет веской причины, вам, вероятно, следует поместить модули в папку и иметь только их по пути python, как показано ниже:

Package-1/
  namespace/
  __init__.py
  module1.py
  module2.py
-8
ответ дан 24 November 2019 в 00:19
поделиться

Этот раздел должен быть довольно понятным.

Короче говоря, поместите код пространства имен в __ init __. Py , update setup.py объявить пространство имен, и вы можете идти.

5
ответ дан 24 November 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: