【问题标题】:How to create typing.Literal from multiple lists of values in python如何从 python 中的多个值列表创建类型化.Literal
【发布时间】:2022-02-19 19:20:08
【问题描述】:

我有两个列表。我想使用这两个列表创建一个Literal

category1 = ["image/jpeg", "image/png"]
category2 = ["application/pdf"]

SUPPORTED_TYPES = typing.Literal[category1 + category2]

有什么办法吗?

我看到了typing: Dynamically Create Literal Alias from List of Valid Values 的问题,但这不适用于我的用例,因为我不希望mimetype 的类型为typing.Tuple

我将在函数中使用Literal -

def process_file(filename: str, mimetype: SUPPORTED_TYPES)

我尝试过的-

supported_types_list = category1 + category2
SUPPORTED_TYPES = Literal[supported_types_list]
SUPPORTED_TYPES = Literal[*supported_types_list]

# this gives 2 different literals, rather i want only 1 literal
SUPPORTED_TYPES = Union[Literal["image/jpeg", "image/png"], Literal["application/pdf"]]    

【问题讨论】:

  • "因为我不希望 mimetype 的类型为 typing.Tuple" - 但它不会是 typing.Tuple 类型。这将是一种文字类型,正是您所需要的。
  • 也许您只是对所有大写字母在您链接的问题中相反这一事实感到困惑。

标签: python type-hinting python-typing


【解决方案1】:

使用与您链接的问题相同的技术:从文字类型构建列表,而不是相反:

SUPPORTED_IMAGE_TYPES = typing.Literal["image/jpeg", "image/png"]
SUPPORTED_OTHER_TYPES = typing.Literal["application/pdf"]

SUPPORTED_TYPES = typing.Literal[SUPPORTED_IMAGE_TYPES, SUPPORTED_OTHER_TYPES]

category1 = list(typing.get_args(SUPPORTED_IMAGE_TYPES))
category2 = list(typing.get_args(SUPPORTED_OTHER_TYPES))

其他答案中唯一未涵盖的部分是SUPPORTED_TYPES = typing.Literal[SUPPORTED_IMAGE_TYPES, SUPPORTED_OTHER_TYPES],即yeah, you can do that。它等同于您对SUPPORTED_TYPES 的原始定义。

【讨论】:

    【解决方案2】:

    我得到了答案—— 为两个列表创建一个文字,然后创建一个组合文字

    category1 = Literal["image/jpeg", "image/png"]
    category2 = Literal["application/pdf"]
    
    SUPPORTED_TYPES = Literal[category1, category2]
    

    抱歉:没看到莫妮卡回答了这个问题

    【讨论】:

      猜你喜欢
      • 2018-12-31
      • 2021-11-24
      • 2022-06-27
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 2020-04-28
      相关资源
      最近更新 更多