是解决mypy和sqlalchemy问题的一种方法,在定义
expresison
的hybrid property
时,它触发了name <func> already defined
class User(Base):
first_name: Mapped[str] = mapped_column(String(100), nullable=False)
last_name: Mapped[str] = mapped_column(String(100), nullable=False)
@hybrid_property
def name(self) -> str:
return f"{self.first_name} {self.last_name}"
@full_name.expression
def name(cls) -> str:
return cls.first_name + " " + cls.last_name
我不想安装外部存根包或使用
# type : ignore
忽略它。
有没有办法重命名表达式或其他东西?
在使用 SQLAlchemy 的
mypy
时,我也遇到过类似的问题。出现问题的原因是您将方法 hybrid_property
定义了两次:一次作为实例方法,一次作为表达式的类方法,这会导致 name
报告重复定义错误。要在不安装外部存根或使用 mypy
的情况下解决此问题,您可以重命名表达式方法并将其显式分配给
# type: ignore
。以下是修改代码的方法:hybrid_property
通过使用不同的名称定义
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'user'
id: Mapped[int] = mapped_column(primary_key=True)
first_name: Mapped[str] = mapped_column(String(100), nullable=False)
last_name: Mapped[str] = mapped_column(String(100), nullable=False)
def _get_name(self) -> str:
return f"{self.first_name} {self.last_name}"
@classmethod
def _name_expr(cls):
return cls.first_name + " " + cls.last_name
name = hybrid_property(fget=_get_name, expr=_name_expr)
和
_get_name
,您可以避免重新定义 _name_expr
,并且 name
也不会抱怨重复的定义。然后,将它们分配给名为 mypy
的 hybrid_property
。这种方法可以使您的代码保持干净和类型安全,而无需抑制类型检查或添加外部包。