Python类型:返回类型,带有类似于javaclazz中的Clazz[T]之类的泛型<;T>;

Python类型:返回类型,带有类似于javaclazz中的Clazz[T]之类的泛型<;T>;,python,python-3.x,generics,optional,python-typing,Python,Python 3.x,Generics,Optional,Python Typing,所以我知道pythons正在键入.Optional。但是我编写了自己的原始PyOptional(),并希望将Optional[T]与PyOptional-to-PyOptional[T]结合起来 我目前正在使用Python 3.7,并尝试扩展typing.Optional 我的一些朋友是可选的 class-py可选: T:TypeVar=TypeVar(“T”) 定义初始化(自,对象:T): self.value:Any=obj def get(自我)->可选[T]: 回归自我价值 def或_e

所以我知道pythons正在键入.Optional。但是我编写了自己的原始PyOptional(),并希望将Optional[T]与PyOptional-to-PyOptional[T]结合起来

我目前正在使用Python 3.7,并尝试扩展typing.Optional

我的一些朋友是可选的

class-py可选:
T:TypeVar=TypeVar(“T”)
定义初始化(自,对象:T):
self.value:Any=obj
def get(自我)->可选[T]:
回归自我价值
def或_else(自身、默认)->T:
返回self.value或默认值
我想要的伪代码:

def find\u user\u by\u id(id:int)->PyOptional[user]:
返回PyOptional(db.find_user_by_id(id))

目标是让我的IDE能够检查预期的返回类型,并且仍然能够调用返回对象上的方法。因此,它必须符合PEP。

您应该查看有关泛型的文档,特别是。mypy文档还有一个可供参考的完整文档

在这种特殊情况下,您希望通过添加
generic[T]
作为类基,使整个类成为泛型的。仅在单个函数签名中使用
T
,将使每个单独的函数成为通用函数,而不是整个类:

输入import-TypeVar,通用,可选
T=类型变量(“T”)
类PyOptional(泛型[T]):
定义初始化(self,obj:可选[T])->无:
self.value=obj
def get(自我)->可选[T]:
回归自我价值
def或_else(自身,默认值:T)->T:
返回self.value或默认值
一些补充说明:

  • 不要为任何TypeVar变量添加注释。在这里,
    T
    是一种元类型构造,用作“洞”,可以表示任意数量的类型。因此,为它指定一个固定类型并没有真正意义,并且会混淆类型检查器

  • 千万不要在任何给定的签名中只使用一次TypeVar——使用TypeVar的全部意义在于,您可以声明两个或多个类型总是相同的

    请注意,上面的fixed PyOptional类也遵守此规则。例如,以
    get
    为例。现在我们将整个类设置为泛型,该函数的类型签名现在基本上类似于
    def-get(self:PyOptional[T])->Optional[T]
    。以前,它更像是
    def-get(self:PyOptional)->Optional[T]

  • 为了使类有意义,您可能希望构造函数接受一个
    可选的[T]
    ,而不仅仅是
    T

  • 使
    self.value
    Any可能没有必要/不必要地过于模糊。我们可以省去类型提示,现在它将有一个推断类型
    Optional[T]

  • <> LI>

    如果您想更彻底地检查您的类是否符合PEP 484,并且可能会被IDES(如PyCharm)理解,请考虑使用类,通过PEP 484类型检查器检查类+一些代码, 这并不能保证您的IDE能够完全理解您的类(因为它可能无法完全实现关于PEP 484的所有内容/您可能会在mypy或IDE中遇到错误),但它应该可以帮助您非常接近


    非常感谢。这正是我想要的,我可以确认它的工作!