gpt4 book ai didi

Python 输入 : return type with generics like Clazz[T] as in Java Clazz

转载 作者:太空宇宙 更新时间:2023-11-04 04:02:58 24 4
gpt4 key购买 nike

所以我知道 Python 的 typing.Optional。但是我自己编写了粗略的 PyOptional(代码 here )并想将 Optional[T] 与我的 PyOptional 结合到 PyOptional[T].

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

我的一些PyOptional:

class PyOptional:
T: TypeVar = TypeVar("T")

def __init__(self, obj: T):
self.value: Any = obj

def get(self) -> Optional[T]:
return self.value

def or_else(self, default) -> T:
return self.value or default

我想要的伪代码:

def find_user_by_id(id: int) -> PyOptional[User]:
return PyOptional(db.find_user_by_id(id))

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

最佳答案

您应该查看有关泛型的文档——具体来说,user-defined generics . mypy 文档也有详尽的 overview of generics可以作为引用。

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

from typing import TypeVar, Generic, Optional

T = TypeVar("T")

class PyOptional(Generic[T]):
def __init__(self, obj: Optional[T]) -> None:
self.value = obj

def get(self) -> Optional[T]:
return self.value

def or_else(self, default: T) -> T:
return self.value or default

一些补充说明:

  1. 不要为任何 TypeVar 变量添加注释。这里,T 是一种元类型构造,充当“洞”/可以表示任意数量的类型。因此,为它分配一个固定类型实际上没有任何意义,而且会混淆类型检查器。

  2. 永远不要在任何给定的签名中只使用一次 TypeVar——使用 TypeVars 的全部意义在于您可以声明两个或多个类型始终相同。

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

  3. 为了使您的类有意义,您可能希望构造函数接受 Optional[T] 而不仅仅是 T

  4. 制作 self.value Any 可能是不必要的/太模糊了。我们可以省略类型提示,现在它将具有 Optional[T] 的推断类型。

  5. 如果您想更彻底地检查您的类是否符合 PEP 484 并且可能被 PyCharm 等 IDE 理解,请考虑通过 mypy 对您的类 + 使用您的类的一些代码进行类型检查。 ,一个 PEP 484 类型检查器。

    这不能保证您的 IDE 将完全理解您的类(因为它可能无法完全实现有关 PEP 484 的所有内容/您可能会在 mypy 或您的 IDE 中遇到错误),但它应该可以帮助您非常接近.

关于Python 输入 : return type with generics like Clazz[T] as in Java Clazz<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57867124/

24 4 0
文章推荐: c++ - 多线程dll和锁定whan从第二个线程调用函数
文章推荐: linux - Linux 机器中 crontab 的服务名称是什么?
文章推荐: php - 使用 PHP die() 时回显
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com