【问题标题】:Is there a way to pass an array to a python generic?有没有办法将数组传递给 python 泛型?
【发布时间】:2021-11-19 23:49:24
【问题描述】:

我正在做一些元编程,我需要一种动态定义类型提示的方法。有没有办法将参数数组传递给类型提示?比如:

# Some programatically generated list where I don't know the content until runtime
permitted_types = [int, str, bool, float, list, dict]

union = Union[*permitted_types]

上面的代码产生:

TypeError: Union[arg, ...]: each arg must be a type. Got [<class 'int'>, <class 'str'>, <class 'bool'>, <class 'float'>, <class 'list'>, <class 'dict'>]

有人知道这样做的语法吗?目前我被简化为以下内容,我讨厌它:

num_args = len(args)
if num_args == 1:
    return origin[args[0]]
elif num_args == 2:
    return origin[args[0], args[1]]
elif num_args == 3:
    return origin[args[0], args[1], args[2]]
elif num_args == 4:
    return origin[args[0], args[1], args[2], args[3]]
elif num_args == 5:
    return origin[args[0], args[1], args[2], args[3], args[4]]
elif num_args == 6:
    return origin[args[0], args[1], args[2], args[3], args[4], args[5]]
else:
    # Raise error

【问题讨论】:

  • 类型提示是一个存在于运行时之外的概念。换句话说,您必须提前知道所有支持的类型的超集。但是,您可以使用 TypeVar 之类的东西来表示 generics
  • @0x5453 - 它们大多存在于运行时之外 - 某些情况会导致它们以某些形式持续到运行时。例如:``` @dataclass class Foo: obj: List[str] print(Foo.__dataclass_fields__['obj'].type) ``` (抱歉格式化) - 你可以看到该类型在运行时存在
  • 如果你直到运行时才知道permitted_types的内容,它应该如何帮助你验证代码的正确性?或者你还希望通过使用类型注释来完成什么
  • @tofarr 是的,好点。数据类是在运行时使用类型提示的一个很好的例子。 __annotations__ 属性是另一个有趣的例子。
  • @KarlKnechtel - 在这种情况下,目标不是使用类型提示来验证代码的正确性,而是帮助生成数据编组/解组的绑定。 (类似于 marshmallow / pydantic,但有一些额外的秘密)然后类型注释用于验证客户端代码是否正确。

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


【解决方案1】:

好的 - 我通过在 typing.py 中翻找找到了语法:

return Union[tuple(permitted_types)]

【讨论】:

  • 您应该知道,虽然这是合法的 Python 语法,但对于任何 Python 静态类型检查器来说,它的当前功能都无法理解。跨度>
  • @AlexWaygood - 感谢您的提醒 - 我实际上试图在这里解决的问题实际上与类型提示处理直接相关,因此大多数客户端代码都会很好并且类型安全,而丑陋的隐藏在代码库的一些黑暗角落。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多