Структура проекта Python: «Неразрешенная ссылка» - PullRequest
2 голосов
/ 27 марта 2019

Я структурировал свой проект на Python так:

- project/
+- package/
 +- db/
  +- __init__.py
  +- mydb.py
+- tests/
 +- context.py
 +- mytest.py
+- file.py

В project/package/db/__init__.py Я объявил mydb как:

from package.db import mydb

С этим объявлением я могу использовать функции mydb вfile.py, используя:

import package.db as db

db.mydb.myfunction()

Но я бы хотел использовать эту функцию и в каталоге project/tests.Итак, я добавил project/tests/context.py файл с:

import os
import sys

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

import package.db as db

И в mytest.py:

from context import db

db.mydb.myfunction()

Он работает хорошо.

Но PyChar говорит, что:

  • import package.db as db (в context.py) - неиспользуемая инструкция импорта
  • from context import db (в mytest.py) содержит неразрешенную (контекстную) ссылку

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

Спасибо

1 Ответ

1 голос
/ 27 марта 2019
  1. В ваших папках package и tests нет файла __init__.py; Это означает, что это не пакет Python. - Если вы хотите, чтобы они были.

  2. Вы неправильно используете оператор импорта; Кроме того, вы не используете импорт в файле context.py, поэтому для его исправления необходимо удалить строку.

  3. Предлагаю прочитать подробнее здесь о пакетах; что даст вам более глубокое понимание того, что вы должны поместить в свои __init__.py файлы.

Файлы __init__.py необходимы, чтобы Python рассматривал каталоги как содержащие пакеты; это сделано для предотвращения непреднамеренного скрытия действительными модулями каталогов с общим именем, например, строки, которые встречаются позже в пути поиска модулей. В простейшем случае init .py может быть просто пустым файлом, но он также может выполнить код инициализации для пакета или установить переменную __all__, как описано ниже.

Структура, которую я бы использовал:

- package_name
   - db
     - __init__.py
     - my_db.py
   - tests
     - __init__.py
     - my_test.py
   - __init__.py

Единственный код, который вам нужно добавить, находится в файле my_db.py:

def my_function():
    return 1

и в вашем my_test.py файле вы будете иметь:

from package.db import mydb

mydb.my_function()

Это все, что вам нужно; в отношении изменения импорта через файл __init__.py, посмотрите __all__, если вам действительно нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...