Подсказка типа Python на импортируемые модули - PullRequest
0 голосов
/ 09 ноября 2018

Я считаю, что автозаполнения для 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?

...