【问题标题】:How do I specify this kind of variable argument tuple with python typing?如何使用 python 类型指定这种可变参数元组?
【发布时间】:2019-02-24 20:34:48
【问题描述】:

我正在尝试这样做,但我不确定如何指定类型签名:

def initialize_signals(
        self,
        command: InitializeCommand,
        initializers: Iterable[Union[
            Tuple[SignalNode],
            Tuple[SignalNode, Any, ...]
                  ]]):
    for x, *args in initializers:
        potential_update = command.create_potential_update(x, *args)

【问题讨论】:

    标签: python python-typing


    【解决方案1】:

    目前还没有可以表示固定长度元组与可变长度元组相加的注解。

    这是我用来确定 mypy 的推理如何处理这样的事情的一些代码:

    from typing import Tuple
    
    x: Tuple[int, ...]
    y = ('hi', *x)
    z = (*x,)
    reveal_type(y)
    reveal_type(z)
    

    和输出:

    $ mypy t.py
    t.py:6: error: Revealed type is 'builtins.tuple[builtins.object*]'
    t.py:7: error: Revealed type is 'builtins.tuple[builtins.int*]'
    

    尽管知道它是一个可变长度的int 元组,但它会衰减为object

    您可能希望重构代码以改用Tuple[SignalNode, Tuple[Any, ...]]

    【讨论】:

    • 谢谢!我知道您建议的重构更合乎逻辑。但是,这段代码被调用的次数太多,以至于到处添加(,) 感觉很痛苦。看来这个特性理论上可以(并且不会破坏任何东西)被添加到 python 类型中。
    猜你喜欢
    • 2011-01-27
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多