如何从Python中的多个值列表创建typing.Literal

Sne*_*nga 5 python type-hinting python-typing

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

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

SUPPORTED_TYPES = typing.Literal[category1 + category2]
Run Code Online (Sandbox Code Playgroud)

有什么办法可以做到这一点吗?

我已经看到问题了输入:Dynamically Create Literal Alias from List of Valid Values但这对我的用例不起作用,因为我不想mimetype成为类型typing.Tuple

我将使用Literal在函数中使用 -

def process_file(filename: str, mimetype: SUPPORTED_TYPES)
Run Code Online (Sandbox Code Playgroud)

我尝试过的 -

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"]]    
Run Code Online (Sandbox Code Playgroud)

use*_*ica 7

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

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))
Run Code Online (Sandbox Code Playgroud)

其他答案中尚未涵盖的唯一部分是SUPPORTED_TYPES = typing.Literal[SUPPORTED_IMAGE_TYPES, SUPPORTED_OTHER_TYPES]是的,您可以做到这一点。它相当于你原来的定义SUPPORTED_TYPES