【发布时间】:2022-12-22 15:08:38
【问题描述】:
我正在尝试将 mypy 与 SQLAlchemy 一起使用。
为了验证/修改特定的列值(在本例中为email),SQLAlchemy official document提供了hybrid_property装饰器。
问题是,mypy 无法正确识别 EmailAddress 类构造函数,它给出:
email_address.py:31: error: Unexpected keyword argument "email" for "EmailAddress"; did you mean "_email"?
我如何告诉 mypy 识别这些列?
from typing import TYPE_CHECKING
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
# I don't even like the following statements just for setter
if TYPE_CHECKING:
hybrid_property = property
else:
from sqlalchemy.ext.hybrid import hybrid_property
Base = declarative_base()
class EmailAddress(Base):
__tablename__ = "email_address"
id = Column(Integer, primary_key=True)
_email = Column("email", String)
@hybrid_property
def email(self):
return self._email
@email.setter
def email(self, email):
self._email = email
EmailAddress(email="foobar@example.com")
# email_address.py:31: error: Unexpected keyword argument "email" for "EmailAddress"; did you mean "_email"?
我正在使用以下软件包:
SQLAlchemy==1.4.35
mypy==0.942
mypy-extensions==0.4.3
sqlalchemy2-stubs==0.0.2a22
【问题讨论】:
-
到目前为止,您是否找到了让它发挥作用的方法?
-
@Welyweloo,不。在对象初始化后分配属性“技术上”可以避免 mypy 错误,但这与我想要的相差甚远,例如
email = EmailAddress()然后email.email = "foobar@example.com" -
@Welyweloo,我在下面写下了我的答案。
标签: python sqlalchemy mypy