Я считаю, что автозаполнения для Flask несколько не хватает - это потому, что внутренне контекстно-зависимые объекты, такие как current_app
, request
и logger
, на самом деле LocalProxy
s. Таким образом, PyCharm разумно не знает, что делать с этим типом.
Таким образом, очевидным решением этого для меня было бы применить подсказки типа к импортированным модулям. За исключением того, что вы не можете сделать это! Начиная с Python 3.7 такого синтаксиса для облегчения этого не существует.
Таким образом, следующим очевидным решением было бы создание локальных копий каждого контекстно-зависимого модуля с явно заданным типом:
from logging import Logger
from flask import Flask, Request, Blueprint, request, current_app as app
app: Flask = app
logger: Logger = app.logger
request: Request = request
... который работает до тех пор, пока вы фактически не попытаетесь запустить сервер, и в этом случае происходит сбой приложения из-за RuntimeError: Working outside of application context.
Оказывается, что мы можем фактически инкапсулировать соответствующие подсказки типов внутри класса или другой области видимости внутри контекста приложения.
@foo_blueprint.route('/foo', methods=['GET'])
def foo(cls):
_app: Flask = app
_logger: Logger = app.logger
_request: Request = request
# ...
... который работает, но невероятно неловко во всех мыслимых смыслах.
Есть ли разумное решение для получения правильных подсказок типов внутри контекста приложения во Flask?