Делаем импорт модуля Python однозначным - PullRequest
1 голос
/ 12 июля 2020

Считайте, что у вас следующая структура проекта:

FooProject
├── foo_components
│   ├── __init__.py
│   └── foo1.py
├── utils
│   ├── __init__.py
│   └── utils1.py
├── tests
│   ├── __init__.py
│   └── foo_components
│        ├── __init__.py
│        └── test_foo1.py
│   ├── utils
│        └── __init__.py
│        └──test_utils1.py
|
└── __init__.py 

Мой вопрос следующий: Предположим, вы находитесь в области test_foo1.py файла, чтобы протестировать впечатляющий компонент foo, называемый: foo1. Вы хотите импортировать следующее:

from foo_components.foo1 import Foo1

Но тогда вы получите сообщение об ошибке из-за двусмысленности: Module not found for foo_components.foo1.

Вероятно, это связано с тем, что в вашей области видимости модуль foo_components упоминается как путь модулей: tests.foo_components. (что означает, что в нем нет foo1, скорее всего test_foo1).

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

В вашем решении, пожалуйста, избегайте предлагать импорт с относительным импортом, насколько я знаю, это неплохая практика, что означает что-то вроде from ../../xyz import foo1. Я подумал о том, чтобы изменить foo_component, чтобы он не был таким же именем, также при тестировании, но мне тоже не нравится это решение, я думаю, есть какой-то разумный способ. Есть предложения?

1 Ответ

1 голос
/ 13 июля 2020

Можно попробовать импортировать именно из библиотеки проекта root. Как это: Из FooProject.foo_components import foo1.py

Я в этом случае не go другим foo_components, и если вы хотите go там, чем вы можете: Из FooProject .tests.foo_components import test_foo1.py

...