【问题标题】:Optional return type annotations?可选的返回类型注释?
【发布时间】:2017-02-10 19:36:14
【问题描述】:

我有一个函数可以返回生成器 (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,但还没有找到任何允许这样做的方法。我也无法通过谷歌搜索找到任何示例。

【问题讨论】:

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


    【解决方案1】:

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

    1. 创建一个Union 类型

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

      这意味着“返回列表或生成器”(您也可以使用GeneratorList);或

    2. 类型基于您可以从 either 返回值中获得的行为,例如他们是Iterable:

      def foo(switch: bool) -> Iterable:  
      

    在这两种情况下,您还可以提供更多详细信息:列表或生成器/可迭代什么?

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

    • 具有两个不同返回值的单个函数不是正确的界面设计;或
    • 而不是list,您可以使用更通用的Sequence,以允许例如改为使用tuples。

    【讨论】:

    • @bjd2385 它有效,但如果您提供更多信息,您可能会为您尝试解决的实际问题获得更好的解决方案。
    • 它将是一个包含绝对路径文件名的字符串的生成器或列表,我很抱歉。
    • @bjd2385 但为什么是生成器 or 列表?事情是否会迭代它们返回的任何东西(在这种情况下Iterable[str] 似乎合适)还是什么?这将如何使用?
    • 既然你提到了,我不知道,我会删除它。不过,我提出了这个想法/问题,因为我知道它可能会提出其他类型,所以也许这是一个糟糕的例子。
    • 其实,再想一想,这里有一个具体的例子:像上面这样的函数,它打开图像并返回图像数据。一方面,如果我有足够的内存,只需打开它们和return 一个list 的图像(NumPy)数组。另一边,yield一个个一个一个;在每种情况下,我都有一个可迭代的。
    【解决方案2】:

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

    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)
    

    不知道是不是这样。

    【讨论】:

    • 这并不能真正回答 OP 的问题,即如何注释返回类型。这也不是正确的语法,或 的正确注释“返回与参数类型相同的类型”
    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 2018-12-15
    • 2022-11-15
    • 2017-03-04
    • 2014-01-26
    • 1970-01-01
    相关资源
    最近更新 更多