他用实用程序包装器替换方法的技巧使Pyright误以为None,但安装了存根后,它知道会返回另一个Query实例。如果你说的是PEP 484支持,它还没有实现,因为到目前为止SQLAlchemy仍然支持Python 2.7。SQLAlchemy 1.4旨在

他用实用程序包装器替换方法的技巧使Pyright误以为None,但安装了存根后,它知道会返回另一个Query实例。如果你说的是PEP 484支持,它还没有实现,因为到目前为止SQLAlchemy仍然支持Python 2.7。SQLAlchemy 1.4旨在,python,sqlalchemy,type-hinting,pylance,pyright,Python,Sqlalchemy,Type Hinting,Pylance,Pyright,他用实用程序包装器替换方法的技巧使Pyright误以为None,但安装了存根后,它知道会返回另一个Query实例。如果你说的是PEP 484支持,它还没有实现,因为到目前为止SQLAlchemy仍然支持Python 2.7。SQLAlchemy 1.4旨在促进从SQLA1.3和SQLA2.0的转换,后者放弃了对Python2.7的支持,并且很可能支持PEP 484。啊,很高兴知道。我只是挠头说,sub\u query=sub\u query.filter(…)似乎会将None分配给sub\u q


他用实用程序包装器替换方法的技巧使Pyright误以为
None
,但安装了存根后,它知道会返回另一个
Query
实例。

如果你说的是PEP 484支持,它还没有实现,因为到目前为止SQLAlchemy仍然支持Python 2.7。SQLAlchemy 1.4旨在促进从SQLA1.3和SQLA2.0的转换,后者放弃了对Python2.7的支持,并且很可能支持PEP 484。啊,很高兴知道。我只是挠头说,
sub\u query=sub\u query.filter(…)
似乎会将
None
分配给
sub\u query
,但这显然不会在后续调用
sub\u query时发生。filter
不会导致异常-通过代码运行的方式,
filter
将返回一个
Query
Iirc
Query。filter
\u generative
修饰符修饰。它创建副本,将其传递到
过滤器()
,然后返回。就像一句“为什么它有效”一样。既然你说你是Python新手,你可以在这里阅读关于装饰者的文章,例如:。感谢你的教育!如果您谈论的是PEP 484支持,那么它还没有实现,因为到目前为止SQLAlchemy仍然支持Python 2.7。SQLAlchemy 1.4旨在促进从SQLA1.3和SQLA2.0的转换,后者放弃了对Python2.7的支持,并且很可能支持PEP 484。啊,很高兴知道。我只是挠头说,
sub\u query=sub\u query.filter(…)
似乎会将
None
分配给
sub\u query
,但这显然不会在后续调用
sub\u query时发生。filter
不会导致异常-通过代码运行的方式,
filter
将返回一个
Query
Iirc
Query。filter
\u generative
修饰符修饰。它创建副本,将其传递到
过滤器()
,然后返回。就像一句“为什么它有效”一样。既然你说你是Python新手,你可以在这里阅读关于装饰者的文章,例如:。感谢你的教育!
from sqlalchemy.orm.query import Query

class DbContext:
    def __init__(self, db_host, db_port, db_name, db_user, db_password):

        engine = create_engine(...)

        session = sessionmaker(bind=engine)
        self.Session: Session = session(bind=engine)

...

def fetch(context: DbContext, filters: ...):
    sub_query: Query = context.Session.query(...)
if filters.name is not None:
    sub_query = sub_query.filter(
        Person.name.ilike(f"%{filters.name}%"))
def filter(self, *criterion):
    for criterion in list(criterion):
        criterion = expression._expression_literal_as_text(criterion)

        criterion = self._adapt_clause(criterion, True, True)

        if self._criterion is not None:
            self._criterion = self._criterion & criterion
        else:
            self._criterion = criterion
# Does NOT work, filtering is not applied
if filters.name is not None:
  sub_query.filter(
               Person.name.ilike(f"%{filters.name}%"))

# Works but Pylance complains
if filters.name is not None:
  sub_query = sub_query.filter(
               Person.name.ilike(f"%{filters.name}%"))