python / django, где находится корень пространства имен? - PullRequest
3 голосов
/ 27 мая 2019

из php, пространства имен всегда хорошо определены в php, обычно используя psr-4 из composer

https://getcomposer.org/doc/04-schema.md#psr-4

например. у вас есть папка

src/Foo/Bar/Baz

затем вы определяете в файле composer.json, что src/Foo - это место, где начинается пространство имен Foo

после этого все подпапки по соглашению представляют собой новое подпространство имен, например

src/Foo/Bar/Baz/MyClass.php превращается в

Foo.Bar.Baz.MyClass

Скажем, я хочу добавить в свой проект django класс Python, который я хочу использовать во всех "приложениях" django

Куда бы я его бросил и как правильно определить пространство имен? Что такое прозрачный способ понять пространства имен в Python?

Ответы [ 2 ]

3 голосов
/ 27 мая 2019

Из этого документа:

https://docs.djangoproject.com/en/2.2/ref/applications/#projects-and-applications

Является ли этот фрагмент:

A project’s root directory (the one that contains manage.py) is usually the container for all of a project’s applications which aren’t installed separately.

Вы можете создать любую иерархию, которую вы выбрали под этимкаталог для утилит, который может соответствовать системе package python:

https://docs.python.org/3/tutorial/modules.html#packages

1 голос
/ 27 мая 2019

В Python есть путь поиска для модулей. Его можно инициализировать из командной строки с помощью переменной среды PYTHONPATH и получить программный доступ через sys.path.

По умолчанию каталог скрипта, который вы используете для запуска интерпретатора Python, является первой записью в пути поиска.

Любой модуль или пакет на пути Python «запускает новое пространство имен», чтобы использовать вашу формулировку. Давайте предположим, что ваш проект с именем mysite имеет приложение с именем polls и имеет такую ​​структуру:

mysite
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── utils.py
│   └── wsgi.py
├── polls
│   ├── __init__.py
│   ├── models.py
│   ├── utils.py
...

Если вы начнете с python manage.py runserver, пакеты mysite и polls будут доступны.

Я бы сказал, что хорошее место для утилиты для всего проекта - пакет проекта mysite. Таким образом, вы делаете import mysite.utils в любом из ваших приложений. Если он выходит за пределы одного файла, вы можете превратить его в подпакет, поэтому вместо utils.py у вас будет каталог utils, содержащий файл __init__.py.

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

mysite
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── utils.py
│   ├── wsgi.py
│   └── apps
│       └── polls
│           ├── __init__.py
│           ├── models.py
│           ├── utils.py
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...