gpt4 book ai didi

python - 如何类型提示检索动态枚举值的方法?

转载 作者:行者123 更新时间:2023-12-05 02:01:23 26 4
gpt4 key购买 nike

我有一个 Python 模块,其中包含许多定义如下的简单枚举:

class WordType(Enum):
ADJ = "Adjective"
ADV = "Adverb"

class Number(Enum):
S = "Singular"
P = "Plural"

因为有很多这样的枚举,而且我只在运行时决定查询哪些枚举来查询任何给定的输入,所以我想要一个函数可以检索给定枚举类型和枚举值作为字符串的值。我成功地做到了,如下所示:

names = inspect.getmembers(sys.modules[__name__], inspect.isclass)

def get_enum_type(name: str):
enum_class = [x[1] for x in names if x[0] == name]
return enum_class[0]

def get_enum_value(object_name: str, value_name: str):
return get_enum_type(object_name)[value_name]

这很好用,但现在我正在添加类型提示,我正在为如何定义这些方法的返回类型而苦苦挣扎:我试过 sliceLiteral[] , 均由 mypy 建议, 但都没有 checkout (可能是因为我不明白我可以给 Literal[] 什么类型的参数)。

我愿意修改枚举定义,但我更愿意保持动态查询不变。最坏的情况,我能做到# type: ignore或者直接返回 -> Any ,但我希望有更好的东西。

最佳答案

由于您不想检查任何 Enum 的类型,我建议引入一个基本类型(例如GrammaticalEnum)以标记所有的 Enum 并将它们分组到一个自己的模块中:

# module grammar_enums
import sys
import inspect
from enum import Enum


class GrammaticalEnum(Enum):
"""use as a base to mark all grammatical enums"""
pass


class WordType(GrammaticalEnum):
ADJ = "Adjective"
ADV = "Adverb"


class Number(GrammaticalEnum):
S = "Singular"
P = "Plural"


# keep this statement at the end, as all enums must be known first
grammatical_enums = dict(
m for m in inspect.getmembers(sys.modules[__name__], inspect.isclass)
if issubclass(m[1], GrammaticalEnum))

# you might prefer the shorter alternative:
# grammatical_enums = {k: v for (k, v) in globals().items()
# if inspect.isclass(v) and issubclass(v, GrammaticalEnum)}

关于打字,yakir0 已经给出了正确的类型,
但有了共同的基础,您可以缩小它们的范围。

如果你愿意,你甚至可以完全摆脱你的功能:

from grammar_enums import grammatical_enums as g_enums
from grammar_enums import GrammaticalEnum

# just use g_enums instead of get_enum_value like this
WordType_ADJ: GrammaticalEnum = g_enums['WordType']['ADJ']

# ...or use your old functions:

# as your grammatical enums are collected in a dict now,
# you don't need this function any more:
def get_enum_type(name: str) -> Type[GrammaticalEnum]:
return g_enums[name]


def get_enum_value(enum_name: str, value_name: str) -> GrammaticalEnum:
# return get_enum_type(enum_name)[value_name]
return g_enums[enum_name][value_name]

关于python - 如何类型提示检索动态枚举值的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66618847/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com