【问题标题】:Type hint function where return type depends on input list item type返回类型取决于输入列表项类型的类型提示函数
【发布时间】:2023-04-04 03:58:01
【问题描述】:

从输入参数(列表)返回项目的函数的最佳类型提示是什么?

函数如下:

def ask_mcq(title: str, prompt: str, options: list) -> ???:
    ...snip...
    v = tk.IntVar()
    for i, option in enumerate(options):
        tk.Radiobutton(root, text=option, variable=v, value=i).pack(anchor="w")
    ...snip...
    return options[v.get()]

我尝试检查其他问题,例如this one,但似乎没有一个人具体回答了这个问题。我不是专家。


编辑:通过阅读 cmets 和答案,我现在意识到,在我要求用户选择一个选项的情况下,这个问题并没有真正的意义。最好返回一个字符串并在之后处理它。我接受了@balderman 的回答,因为它最适用于这种不太可能的情况。

【问题讨论】:

  • 列表可以容纳哪些类型?
  • @balderman 我试图使其通用,因此它可以容纳列表可以容纳的任何内容。编辑:这是糟糕的编程吗?
  • 好的 - 请参阅下面的答案
  • @balderman 谢谢你的回答。所以我猜如果我不知道列表将包含的项目类型,那么我真的不能输入提示吗?这是否意味着函数编码错误?编辑:错字
  • 这取决于您尝试解决的问题。大多数情况下,列表不包含“任何内容”,因此如果您在编写代码时知道实际类型 - 使用它们会更好(而不是 Any

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


【解决方案1】:

参见下面的示例(假设optionsAny 的列表)

from typing import List,Any


def ask_mcq(title: str, prompt: str, options: List[Any]) -> Any:
    return options[0]

【讨论】:

    【解决方案2】:

    您要链接的问题的答案相当清楚地指定了解决方案。您应该使用函数重载从列表中返回一个值,并在函数内部检查它可以采用哪些可能的值(使用问题答案中的 if 语句),并返回一个类型化变量。

    我认为您的代码看起来像这样:

    from typing import overload
    
    # ...snip...
    
    @overload
    def map_type(value: int) -> MyEnum: ...
    
    @overload
    def map_type(value: str) -> MyCustomClass: ...
    
    
    def ask_mcq(title: str, prompt: str, options: list) -> Union[MyEnum, MyCustomClass]:
        ...snip...
        v = tk.IntVar()
        for i, option in enumerate(options):
            tk.Radiobutton(root, text=option, variable=v, value=i).pack(anchor="w")
        ...snip...
    
        if isinstance(options[v.get()], int):
            return MyEnum(options[v.get()])
        elif isinstance(options[v.get()], str):
            return MyCustomClass(options[v.get()])
        raise TypeError('Invalid input type')
    

    编辑:如果列表可以取任何值,@balderman 的答案更充分。

    【讨论】:

      猜你喜欢
      • 2019-02-25
      • 1970-01-01
      • 2020-06-02
      • 2021-01-26
      • 2019-10-29
      • 2022-01-09
      • 2021-05-13
      • 2018-02-23
      • 2016-07-18
      相关资源
      最近更新 更多