可选 return 类型注释?
Optional return type annotations?
我有一个函数可以 return 生成器 (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
如何告诉它我可以选择 return 列表或其他类型?或者,就此而言,一堆不同的类型呢?
我已经查看了 documentation on a module typing
,但还没有找到允许这样做的任何方法。我也无法通过谷歌搜索找到任何示例。
spring 立即想到的两个解决方案是:
制作一个Union
类型
def foo(switch: bool) -> Union[list, GeneratorType]:
表示"returns either list or generator"(你也可以用Generator
and List
);或
根据您可以从 return 值中预期的行为输入类型,例如他们是 Iterable
:
def foo(switch: bool) -> Iterable:
在这两种情况下,您还可以提供更多详细信息:列表或 generator/iterable of what?
就是说,return 列表或生成器听起来像是一个奇怪的接口,提供更多有关您的函数的使用者应该使用的内容的上下文会很有帮助无论他们收到什么。可能是:
- 具有两个不同 return 的单一功能不是正确的界面设计;或
- 而不是
list
您可以使用更通用的 Sequence
,以允许例如tuple
将被使用。
将"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)
不知道是不是这样
我有一个函数可以 return 生成器 (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
如何告诉它我可以选择 return 列表或其他类型?或者,就此而言,一堆不同的类型呢?
我已经查看了 documentation on a module typing
,但还没有找到允许这样做的任何方法。我也无法通过谷歌搜索找到任何示例。
spring 立即想到的两个解决方案是:
制作一个
Union
类型def foo(switch: bool) -> Union[list, GeneratorType]:
表示"returns either list or generator"(你也可以用
Generator
andList
);或根据您可以从 return 值中预期的行为输入类型,例如他们是
Iterable
:def foo(switch: bool) -> Iterable:
在这两种情况下,您还可以提供更多详细信息:列表或 generator/iterable of what?
就是说,return 列表或生成器听起来像是一个奇怪的接口,提供更多有关您的函数的使用者应该使用的内容的上下文会很有帮助无论他们收到什么。可能是:
- 具有两个不同 return 的单一功能不是正确的界面设计;或
- 而不是
list
您可以使用更通用的Sequence
,以允许例如tuple
将被使用。
将"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)
不知道是不是这样