【问题标题】:How to type hint nametuple in python?如何在python中输入提示namedtuple?
【发布时间】:2019-10-19 13:51:58
【问题描述】:

类型提示在python中可以定义返回类型,所以当函数返回namedtuple类型时,如何定义它

def bar(func):
    def decorator(*args, **kwargs):
        return namedtuple('data', 'name user')(**func(*args, **kwargs))

    return update_wrapper(decorator, func)


@bar
def info() -> NamedTuple:
    return {'name': 'a1', 'user': 'b1'}

期望类型 'NamedTuple',得到 Dict[str,str] 代替

如你所知,函数info()返回Dict[str, str],但是装饰器@bar改变了它。现在函数info()返回了一个namedtuple对象,那么有没有办法通过python中的类型提示来指示函数info()返回namedtupe对象呢?

【问题讨论】:

  • 你知道如何使用命名元组吗?你读过typing.NamedTuple的文档吗?
  • 欢迎来到 SO。我假设您在 info 方法上遇到错误?

标签: python python-3.x type-hinting


【解决方案1】:

NamedTuple 实例是通过collections.namedtuple() 函数创建的。

由于您对命名元组的类型元素感兴趣,您可以创建一个自定义类型来继承 NamedType 的类型化版本(如 @jab 所述)并在类型提示中使用它,如下所示。

from typing import NamedTuple

class CustomType(NamedTuple):
    name: str
    user: str

def info() -> CustomType:
    return CustomType('a1', 'b1')

【讨论】:

  • 这是一个信息丰富的答案,但显示的代码与问题的上下文不匹配。装饰器 (@bar) 如何适应这个...我想知道。
  • 问题中,错误信息对应info()的类型提示。我认为@bar 是 OP 尝试向info() 添加类型提示的一部分。如果假设正确,则不需要@bar。如果不是,那么 OP 应该澄清@bar 的预期目的。
猜你喜欢
  • 2016-03-20
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 2021-11-27
  • 2019-08-15
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多