через @contextmanager ?
Вот этот код прекрасно понимает PyCharm, автодополнение кода работает как надо:
@contextmanager
def db_session() -> ContextManager[Session]:
session: Session = DBSession()
try:
yield session
session.flush()
session.expunge_all()
session.commit()
except Exception:
session.rollback()
raise
finally:
session.close()
Но на этот код ругается mypy, который я использую в pre-commit хуках:
error: Argument 1 to "contextmanager" has incompatible type "Callable[[], ContextManager[Any]]"; expected "Callable[..., Iterator[<nothing>]]”
Если же я делаю как хочет mypy: def db_session() -> Iterator[Session] ,то теперь mypy счастлив, но вот PyCharm больше не делает автодополнение по коду, он перестает понимать, что этот контект менеджер возвращает объекти типа Session.
Как бы сделать так, чтобы PyCharm и mypy договорились бы друг с другом?
P.S. Причер усмирить mypy не так просто. Если в определении db_session я могу успокоить mypy через комменты типа # type:ignore,
то он начинает ругаться на все те места, где я этот контекс сессий начинаю использовать: error: Need type annotation for 'db
Какой ужас.
Обсуждают сегодня