使用 sqlalchemy 的混合属性和表达式时,Mypy 出现“名称<func>已定义”问题

问题描述 投票:0回答:1

是解决mypysqlalchemy问题的一种方法,在定义

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
忽略它。 有没有办法重命名表达式或其他东西?

python sqlalchemy fastapi mypy
1个回答
0
投票

在使用 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
这种方法可以使您的代码保持干净和类型安全,而无需抑制类型检查或添加外部包。

© www.soinside.com 2019 - 2024. All rights reserved.