可选的返回类型注释?

时间:2016-10-02 21:13:24

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

我有一个函数可以返回一个生成器(types.GeneratorType)或list,具体取决于参数的值。例如:

def foo(switch: bool) -> list: # return type of list || types.GeneratorType
    ... # create some generator object named f1
    if switch:
        return list(f1)
    else:
        return f1

我如何告诉它我可以选择返回列表或其他类型?或者,就此而言,一堆不同类型呢?

我已经查看了documentation on a module typing,但尚未找到任何允许此操作的方法。我还没能通过谷歌搜索找到任何例子。

2 个答案:

答案 0 :(得分:3)

立即想到的两个解决方案是:

  1. 制作Union类型

    def foo(switch: bool) -> Union[list, GeneratorType]:
    

    表示"返回列表或生成器" (您也可以使用GeneratorList);或

  2. 根据您可以从 返回值中获得的行为进行输入,例如它们是Iterable

    def foo(switch: bool) -> Iterable:  
    
  3. 在这两种情况下,您还可以提供更多详细信息:list或generator / iterable of what?

    也就是说,返回列表或生成器的东西听起来像一个奇怪的接口,并且提供更多关于函数的消费者应该对他们收到的内容做什么的更多上下文会很有帮助。可能是:

    • 具有两种不同回报的单一功能不是正确的界面设计;或
    • 而不是list您可以使用更通用的Sequence,以允许例如tuple代替使用。

答案 1 :(得分:0)

将“type”作为参数传递不是更好吗?

def foo(switch: type) -> list | tuple | gen_func
    ... # create some generator object named f1
    return switch(f1)

 foo(list) > list type
 foo(tuple) > tuple
 # And if you would want to get generator you would only need to provide
 gen = lambda func_result: (el for el in func_result)
 foo(gen)

不知道是不是这样。