mypy 无法识别具有 Hybrid_property 的 SQLAlchemy 列

ern*_*nix 5 python sqlalchemy mypy

我正在尝试将 mypy 与 SQLAlchemy 一起使用。为了验证/修改特定列值(email在本例中),SQLAlchemy官方文档提供了hybrid_property装饰器。

问题是,mypy无法EmailAddress正确识别类构造函数,它给出:

email_address.py:31: error: Unexpected keyword argument "email" for "EmailAddress"; did you mean "_email"?
Run Code Online (Sandbox Code Playgroud)

我怎样才能告诉 mypy 识别这些列?

email_address.py:31: error: Unexpected keyword argument "email" for "EmailAddress"; did you mean "_email"?
Run Code Online (Sandbox Code Playgroud)

我正在使用以下软件包:

SQLAlchemy==1.4.35
mypy==0.942
mypy-extensions==0.4.3
sqlalchemy2-stubs==0.0.2a22
Run Code Online (Sandbox Code Playgroud)

ern*_*nix 0

好吧,看来我终于找到了解决问题的方法了。

这让我想起了这里讨论的数据类/属性装饰器之间的不合作行为。

我最终将 EmailAddress 类分成 2 个:

  1. 在基类上使用@dataclass装饰器来指示构造函数选项。
  2. 覆盖email属性,以便 mypy 不会抱怨 redef。
from dataclasses import dataclass
from typing import TYPE_CHECKING, Optional

from sqlalchemy import Column, Integer, String, Table
from sqlalchemy.orm import registry

mapper_registry: registry = registry()

# 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


@dataclass
@mapper_registry.mapped
class EmailAddressBase:
    __tablename__ = "email address"

    id: int = Column(Integer, primary_key=True)
    email: Optional[str] = None


class EmailAddress(EmailAddressBase):
    _email = Column("email", String)

    @hybrid_property
    def email(self):
        return self._email

    @email.setter
    def email(self, email):
        self._email = email


email = EmailAddress(email="foobar@example.com")
print(email.email)
Run Code Online (Sandbox Code Playgroud)