【发布时间】: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() 返回另一个Query,one_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