Как уменьшить повторяющийся импорт из подпапок?

Я работаю над большим проектом в VSCode. У меня есть различные подпапки с множеством файлов .py и main.py в корне проекта. Я хочу импортировать различные функции из разных файлов, которые существуют в разных подпапках. Я считаю from x import y очень излишним процессом. Каков эффективный способ сделать это? Как это делает профессиональный разработчик Python?

my_project/
├── FolderA/
│   ├── __init__.py
│   └── module_a.py
├── FolderB/
│   ├── __init__.py
│   └── module_b.py
├── FolderC/
│   ├── __init__.py
│   └── module_c.py
├── __init__.py
└── main.py

Допустим, выше приведена моя структура, и я хочу вызывать функции в main.py из module_a.py, module_b.py и module_c.py. Спасибо.

Я попробовал следующее, но не могу продолжать делать это для 10/20 функций:

from FolderA.module_a import functionA
from FolderB.module_b import functionB
from FolderC.module_c import functionC

Также попробовал следующее, не помогло:

sys.path.append("D:\Python_workspace\software")
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
0
100
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Чтобы настроить структуру проекта, измените файлы __init__.py в FolderA, FolderB и FolderC следующим образом:

FolderA/__init__.py

from .module_a import *

Если у вас есть несколько файлов в каталоге FolderA, вы можете импортировать все необходимые модули в файл __init__.py. Вот как это можно сделать, если у вас есть дополнительный файл с именем module_a2.py:

FolderA/__init__.py

from .module_a import *  # for module_a.py
from .module_a2 import *  # for module_a2.py

FolderB/__init__.py

from .module_b import *

FolderC/__init__.py

from .module_c import *

представьте, что у вас есть функция с именем add FolderA/module_a.py:

def add(a, b):
    return a+b

Если вы хотите использовать эту функцию в main.py, вы можете использовать любой из следующих методов:

  1. Импортируйте весь модуль FolderA:

    import FolderA
    
    print(FolderA.add(1, 2)) # output will be 3
    
  2. Используйте импорт с подстановочными знаками, чтобы импортировать все из FolderA:

    from FolderA import *
    
    print(add(1, 2)) # output will be 3
    
  3. Импортируйте функцию добавления непосредственно из папки A:

    from FolderA import add
    
    print(add(1, 2)) # output will be 3
    
Ответ принят как подходящий

С практической точки зрения (если указанное вами представление папок соответствует вашему проекту), если вы обнаружите, что у вас много папок с одним файлом в каждой, вы также можете переоценить, являются ли выбранные вами категории/группировки реалистичными. детализированный, и вы получите множество повторяющихся, змеиных импортов, которые вы показали. К сожалению, на этом этапе, имея по одному файлу в папке, вы мало что можете сделать для решения проблемы импорта, кроме реструктуризации дерева проекта.

Однако, если ваш проект уже находится в следующем формате (разница в нескольких файлах в каждой подпапке):

my_project/
├── FolderA/
│   ├── __init__.py
│   ├── module_a1.py
│   └── module_a2.py
├── FolderB/
│   ├── __init__.py
│   ├── module_b1.py
│   └── module_b2.py
├── FolderC/
│   ├── __init__.py
│   ├── module_c1.py
│   └── module_c2.py
├── __init__.py
└── main.py

Затем вы можете настроить импорт в __init__.py (предположим, вы находитесь в FolderA/__init__.py):

from module_a1 import fun1
from module_a2 import fun2

Затем в любом другом файле вы можете просто напрямую сослаться на каталог/пакет и получить то, что вы сейчас импортировали косвенно:

from FolderA import fun1, fun2

Книга Real Simple Python поддерживает этот стиль импорта. Я злоупотребляю импортом *, медленно переключаясь на импорт по функциям (легче отслеживать небольшой проект... Сложнее отслеживать, когда проект становится большим).

AutumnKome 07.06.2024 15:35

Другие вопросы по теме