当前位置: 首页 > 知识库问答 >
问题:

当值是cls的实例时,是否可以注释返回类型?

佘茂才
2023-03-14

给定一个具有用于初始化的帮助器方法的类:

class TrivialClass:
    def __init__(self, str_arg: str):
        self.string_attribute = str_arg

    @classmethod
    def from_int(cls, int_arg: int) -> ?:
        str_arg = str(int_arg)
        return cls(str_arg)

是否可以从\u int方法注释的返回类型?

我尝试了clslittleClass,但PyCharm将它们标记为未解析的引用,这在当时听起来是合理的。


共有3个答案

别峻
2023-03-14

注释返回类型的一种简单方法是使用字符串作为类方法返回值的注释:

# test.py
class TrivialClass:
  def __init__(self, str_arg: str) -> None:
    self.string_attribute = str_arg

  @classmethod
  def from_int(cls, int_arg: int) -> 'TrivialClass':
    str_arg = str(int_arg)
    return cls(str_arg)

这将通过mypy 0.560,并且python没有错误:

$ mypy test.py --disallow-untyped-defs --disallow-untyped-calls
$ python test.py
程英资
2023-03-14

在Python3.7中,您可以使用\uuuu future\uuu。注释

from __future__ import annotations


class TrivialClass:
    # ...

    @classmethod
    def from_int(cls, int_arg: int) -> TrivialClass:
        # ...
        return cls(...)

编辑:你不能子类TrivialClass而不覆盖类方法,但是如果你不需要这个,那么我认为它比前向引用更简洁。

公羊宗清
2023-03-14
匿名用户

使用泛型类型指示将返回cls的实例:

from typing import Type, TypeVar

T = TypeVar('T', bound='TrivialClass')

class TrivialClass:
    # ...

    @classmethod
    def from_int(cls: Type[T], int_arg: int) -> T:
        # ...
        return cls(...)

任何重写class方法但随后返回父类实例(LittleClass或仍然是祖先的子类)的子类都将被检测为错误,因为factory方法被定义为返回类型为cls的实例。

bound参数指定T必须是类的(子类);因为在定义泛型时类还不存在,所以需要使用前向引用(一个名为的字符串)。

请参阅PEP 484的注释实例和类方法部分。

注意:这个答案的第一次修订提倡使用前向引用将类本身命名为返回值,但是第1212期使得使用泛型成为可能,这是一个更好的解决方案。

从Python 3.7开始,当您从导入注释开始使用__future__模块时,您可以避免在注释中使用前向引用,但是在模块级别创建TypeVar()对象不是注释。即使在Python 3.10中也是如此,它在注释中推迟了所有类型提示解析。

 类似资料:
  • 我必须使用一个c函数(),它在失败时返回标量、或。 这适用于以下故障: 但对于有效的论点,我得到: 如何检查呼叫是否成功?

  • 我正试图使用Ehcache和Spring 3.1内置的缓存注释(@Cacheable、@CacheEvict和@CachePut)在我的应用程序中实现缓存。 我创建了一个缓存,如下所示: 我正在尝试使用@CachePut注释用新值更新此缓存,如下所示: 但是,新的“用户”没有添加到缓存中。这是因为无效返回类型吗?

  • 我目前正在讨论消费者和供应商的话题,有以下问题。供应商的返回值是否可以递增? 下面是一个做作的例子:我有一个简单的class Person,id和name。例如,如果出于测试目的我需要10个人,我想用顺序ID轻松地生成他们。从供应商处获取id时,如何增加id? 这样做是我的想法: 或者构造供应商不打算用于这种用例?

  • 问题是,如果我执行上述^,以访问endpoint上的请求信息,则如果筛选器验证失败,我就不能再中止筛选器中的请求,因为我会得到以下错误: 似乎如果您在Jerseyendpoint上定义任何类型的参数,这些参数可以在ContainerRequestContext中访问,那么它将不允许您中止过滤器中的过滤器链。 一个解决方法(我还没有尝试过,但假设会成功)是这样做:如果过滤器验证失败,我可以只向请求添

  • 问题内容: 我已经使用JAXB编写了许多类进行序列化,并且我想知道是否存在一种基于注释为每个对象生成XSD文件的方法。有这个工具吗? 喜欢的东西是 真棒 。有什么可以做的吗? 问题答案: 是的,您可以在JAXBContext上使用该方法: 您可以利用实现控制输出的位置:

  • 问题内容: 我已使用批注将其用于获取计算的属性。我需要的是那些用注解注解的字段/获取器应延迟加载。 这甚至有可能吗? 谢谢 问题答案: 是的。只需使用@Basic(fetch = FetchType.LAZY) 注释属性的字段/ 获取器,然后使用hibernate提供的此ant任务即可为实体类进行字节码检测。否则,将默默忽略该属性的LAZY加载。 该文档包含有关如何使用此ant任务进行字节码检测的