【问题标题】:Type hint equivalent of Dict[str, int] for custom classes with attributes of specific type?对于具有特定类型属性的自定义类,类型提示等效于 Dict[str, int]?
【发布时间】:2021-10-09 01:58:53
【问题描述】:

用户实现了以下函数,该函数是从我的库中调用的。

def run(input_data: Dict[str, Union[Dict, Promise]]):
    pass

库负责收集所需的输入数据,输入数据的格式是已知的。在此示例中,输入数据可能如下所示:

input_data = {'config': {},          # type: Dict
              'value': 'any_value'}  # type: Any or Promise

库使用run函数的类型提示信息来确定用户是否期望Promise对象作为启用实际对象延迟加载的值,或者用户是否期望任意类型的实际内存中对象.因此,基于input_data(它包含Promise)的上述类型提示,库创建并输入Promise 对象,而不是将实际对象加载到内存中并输入它。 但是,如果用户会写

def run(input_data: Dict[str, Union[Dict, AnyOtherType]]):
    pass

实际对象将被加载到内存中并转发到run 方法。

现在,当我将input_data 的结构定义为dataclass 而不是dict 时,如何实现相同的功能。例如。数据类看起来像:

@dataclass
class Data:
    config: Dict
    value: Union[Any, Promise]

value 属性是任何类型,但我必须根据input_data 的类型提示知道它是否属于Promise 类型。在这种情况下,带有 input_data 类型提示的 run 方法如何查看,以便我可以查看 input_data.value 实际上是否属于 Promise 类型?

这样的事情显然行不通:

def run(input_data: Data[value: Promise]):
    pass

只有写作

def run(input_data: Data):
    pass

不告诉我input_data.value 是否属于Promise 类型。

有没有办法向自定义 Data 类型提示添加额外信息,以注释此 Data 实例的 value 属性为 Promise 类型?

感谢您的见解:)

【问题讨论】:

    标签: python type-hinting python-typing python-dataclasses


    【解决方案1】:

    我认为你可以通过继承 typing.Generic 来获得你想要的东西,就像这样:

    from typing import Generic, TypeVar, Dict
    from dataclasses import dataclass 
        
    T = TypeVar('T')
    
    
    @dataclass
    class Data(Generic[T]):
        config: Dict 
        value: T
        
    

    如果您像这样定义 Data 类,您将能够编写像 Data[int]Data[Promise] 这样的类型提示,它们将(分别)表示“Data 的实例,其中 @987654327 @ 属性的类型为 int" 和 "Data 的实例,其中 value 属性的类型为 Promise"

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多