Рубрики
Без рубрики

Рекурсивный импорт – ахиллесовый каблук из питона

Python – это красивый язык синтаксически, а также полезен для читаемости и обслуживания. Бу … Tagged с Python, производительность.

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

Эта слабость проистекает из самой идеи иметь модули Для повторного использования, который, насколько мне известно, ни один другой популярный язык не имеет. В некоторых таких как Java и В # , все класс, поэтому такая проблема никогда не возникает. В других таких как Php , процедурный код разрешен, но они используют простое требовать или Включить Конструкции для добавления многоразового кода.

С Python есть много обстоятельств, когда x модуль импортирует Y, и в то же время модуль Y должен импортировать объект из X. Это очень распространенный сценарий, как только вы начнете разработать сложные приложения. Например, это можно увидеть даже в очень основном колба Приложение, которое имеет свой собственный пакет (скажем, App ), модуль init ( __init__.py ) и модуль маршрутов ( routes.py ), что -то вроде этого:

└───app
    │   __init__.py
    │   routes.py

Это очень просто колба Приложение, где я определяю фактический объект Flask в модуле init:

# c:\source\app\__init__.py
from flask import Flask
from app import routes

app = Flask(__name__)

Теперь позвольте мне определить Routes.py следующим образом:

# c:\source\app\routes.py
from app import app

@app.route('/')
@app.route('/index')
def index():
    return "Hello, World"

Проблема в том, что этот код не сработает! По той простой причине, что модуль init пытается импортировать маршруты, но модуль маршрутов потерпит неудачу (просто потому, что модуль маршрутов пытается импортировать объект App.App из модуля init, который еще не был инициализирован).

Это проблема рекурсивного импорта. Чтобы исправить это, мне придется убедиться, что модуль маршрутов всегда импортирован после Объект приложения был инициализирован следующим образом:

# c:\source\app\__init__.py
from flask import Flask

app = Flask(__name__)

from app import routes

Как вы можете видеть, рекурсивный импорт может быть сложно иметь дело в других структурированном и, казалось бы, легком языке, как Python.

Оригинал: “https://dev.to/prahladyeri/recursive-imports-is-the-achilles-heel-of-python-i25”