我有一个函数可以返回一个生成器(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
,但尚未找到任何允许此操作的方法。我还没能通过谷歌搜索找到任何例子。
答案 0 :(得分:3)
立即想到的两个解决方案是:
制作Union
类型
def foo(switch: bool) -> Union[list, GeneratorType]:
根据您可以从 返回值中获得的行为进行输入,例如它们是Iterable
:
def foo(switch: bool) -> Iterable:
在这两种情况下,您还可以提供更多详细信息: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)
不知道是不是这样。