Импортировать схему / структуру внутри папки python (код очистки) - PullRequest
4 голосов
/ 31 марта 2020

Я только что закончил проект python (3.6) среднего размера, и мне нужно немного его почистить. Я не инженер-программист, поэтому во время разработки я не слишком точно структурировал проект, поэтому теперь у меня есть несколько модулей, которые (больше) не импортируются каким-либо другим модулем, или модули, которые импортируются другими файлами .py, которые на самом деле не нужно.

Так, например, у меня есть

Project/
├── __init__.py
├── main.py
├── foo.py
|
├── tools/
│   ├── __init__.py
│   ├── tool1.py
│   └── tool2.py
│   └── tool3.py
|
├── math/
│   ├── __init__.py
│   ├── math1.py
│   └── math2.py
├── graph/
│   ├── __init__.py
│   ├── graph1.py
│   ├── graph2.py
│

и внутри

main.py

from math import math1
from tools import tool2

graph1.py

from math import math1
from tools import tool1, tool2

foo.py

from tools import tool3

Если бы я мог одним взглядом увидеть, что не модуль импортирует graph2 или math2, я мог бы удалить их или, по крайней мере, добавить их как кандидатов на удаление (и реструктуризация проекта в лучшую сторону). Или я могу подумать об удалении tool3, потому что я знаю, что мне больше не нужно foo.

Существует ли простой способ визуализировать все «соединения» (какой модуль импортирует какой) на диаграмме или какой-то другой вид структурированных данных / способ визуализации?

Ответы [ 3 ]

4 голосов
/ 07 апреля 2020

Вы можете использовать Python, чтобы выполнить работу за вас:

Поместите файл Python со следующим кодом в тот же каталог, что и каталог вашего проекта.

from pathlib import Path

# list all the modules you want to check:
modules = ["tool1", "tool2", "tool3", "math1", "math2", "graph1", "graph2"]

# find all the .py files within your Project directory (also searches subdirectories):
p = Path('./Project')
file_list = list(p.glob('**/*.py'))

# check, which modules are used in each .py file:
for file in file_list:
    with open(file, "r") as f:
        print('*'*10, file, ':')
        file_as_string = f.read()
        for module in modules:
            if module in file_as_string:
                print(module)

Выполнение этого даст вам вывод, похожий на этот:

********** Project\main.py :
tool1
tool2
graph1
********** Project\foo.py :
tool2
********** Project\math\math1.py :
tool2
math2
2 голосов
/ 02 апреля 2020

Если вы на платформе, похожей на Unix (например, macOS), вы можете найти все файлы, содержащие указанный текст c с помощью grep . Таким образом, вы можете искать все файлы, содержащие '' import math1 '' в вашем каталоге Project, например, с помощью grep -rnw '/path/to/Project/' -e 'import math1', и если результатов нет, вы можете безопасно удалить модуль. Весь этот процесс может быть легко автоматизирован с помощью python или сценария оболочки!

1 голос
/ 03 апреля 2020

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

...