mypy и sqlalchemy: ошибка: имя 'sqlalchemy' не определено

У меня есть следующая функция:

def _init_db() -> "sqlalchemy.orm.session.Session":
    engine = create_engine("sqlite:///my_db.db")
    Base.metadata.create_all(engine)

    # Creating Session
    from sqlalchemy.orm import sessionmaker
    Session = sessionmaker(bind = engine)
    session = Session()
    return session

Бег mypy на коде дает мне эту ошибку

ошибка: имя 'sqlalchemy' не определено

Я пробовал с и без кавычек sqlalchemy.orm.session.Session

Как я могу добавить подсказки типа для классов sqlalchemy? Что мне не хватает?

2 ответа

Чтобы использовать подсказки типа, вы импортируете то, что пытаетесь вернуть. В первом примере я пытаюсь определить функцию, возвращающую некоторые вещи sqlite3 без импорта sqlite3. После импорта этого модуля все работает нормально.

In [1]: def init_db() -> sqlite3.Connection:
   ...:     return sqlite3.connection
   ...:
   ...:
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-b64a7629272c> in <module>()
----> 1 def init_db() -> sqlite3.Connection:
      2     return sqlite3.connection

NameError: name 'sqlite3' is not defined

In [2]: import sqlite3

In [3]: def init_db() -> sqlite3.Connection:
   ...:     return sqlite3.connection
   ...:
   ...:

In [4]:

Я получил это благодаря ответу Гончора.

Мне нужно было добавить

from sqlalchemy.orm.session import Session

в начале, а затем сделать

def _init_db() -> "Session":
    engine = create_engine("sqlite:///my_db.db")
    Base.metadata.create_all(engine)

    # Creating Session
    from sqlalchemy.orm import sessionmaker
    Session = sessionmaker(bind = engine)
    session = Session()
    return session
Другие вопросы по тегам