【问题标题】:How can a runtime object type be used as a generic type hint parameter?如何将运行时对象类型用作泛型类型提示参数?
【发布时间】:2016-05-17 14:23:43
【问题描述】:

简介

使用 Python/MyPy 类型提示,可以使用 .pyi 存根将注释保存在单独的文件中以实现实现。我正在使用此功能提供 SQLAlchemy 的 ORM 的基本提示(更具体地说,flask_sqlalchemy 插件)。

模型定义如下:

class MyModel(db.Model):
    id = db.Column()
    ...
...

db.Model 直接包含在 SQLAlchemy 中。 例如,可以通过以下方式查询它们:

MyModel.query.filter({options: options}).one_or_none()

其中filter() 返回另一个Queryone_or_none() 返回MyModel 的实例(或None,显然)。

以下 .pyi 文件成功提示了上述构造,尽管它不完整 - 无法提示 one_or_none() 的返回类型。

class _SQLAlchemy(sqlalchemy.orm.session.Session):
    class Model:
       query = ... # type: _Query

class _Query(sqlalchemy.orm.query.Query):
    def filter(self, *args) -> query.Query: ...
    def one_or_none(self) -> Any: ...

db = ... # type: _SQLAlchemy

问题

如何才能全面而笼统地暗示上述内容,并暗示one_or_none() 的返回类型? 我的第一次尝试是使用泛型,但看起来我无法访问有问题的子类型(在给定的示例中,MyModel)。举例说明一种无效的方法:

from typing import Generic, TypeVar

_T = TypeVar('_T')

class _SQLAlchemy(sqlalchemy.orm.session.Session):
    class Model:
       def __init__(self, *args, **kwargs):
           self.query = ... # type: _Query[self.__class__]

class _Query(Generic[_T], sqlalchemy.orm.query.Query):
    def filter(self, *args) -> _Query[_T]: ...
    def one_or_none(self) -> _T: ...

db = ... # type: _SQLAlchemy

有什么办法可以让它工作吗?

为具体的例子道歉,但我尝试了一段时间用一个通用的例子来简洁地写这个,它从来没有像现在这样清楚(可能仍然不多!)

编辑

另一种不起作用的方法(我知道这将具有必须调用myModelInstance.query...而不是静态MyModel.query的限制,但即使这样也不起作用):

from typing import Generic, TypeVar

_T = TypeVar('_T')

class _SQLAlchemy(sqlalchemy.orm.session.Session):
    class Model:

       @property
       def query(self: _T) -> _Query[_T]: ...

class _Query(Generic[_T], sqlalchemy.orm.query.Query):
    def filter(self, *args) -> _Query[_T]: ...
    def one_or_none(self) -> _T: ...

db = ... # type: _SQLAlchemy

【问题讨论】:

    标签: python python-3.5 type-hinting


    【解决方案1】:

    幸运的是,类型注释存根现在可用于该特定问题https://github.com/dropbox/sqlalchemy-stubs

    Query 类型注释的确切实现可在此处获得:https://github.com/dropbox/sqlalchemy-stubs/blob/master/sqlalchemy-stubs/orm/query.pyi (archive)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多