繁体   English   中英

从枚举值创建 Literal 的最简单/最 Pythonic 的方法是什么?

[英]What is the easiest / most pythonic way of create a Literal from an enum values?

正如问题所暗示的那样,想象以下Enum

class Suits(Enum):
    CLUBS = "CLUBS"
    DIAMONDS = "DIAMONDS"
    HEARTS = "HEARTS"
    SPADES = "SPADES"

我想从Enum值创建一个Literal 我设法做到这一点的唯一方法:

Suit = Literal[Suits.CLUBS, Suits.DIAMONDS, Suits.HEARTS, Suits.SPADES]

这对于小型枚举来说很好,但对于较大的枚举来说很累并且很容易出错。

因此我的问题是,有没有更好的方法来完成Literal创作?


编辑

正如@chepner在评论中指出的那样,我们可以(应该?)使用Enum进行类型检查

我不知道你是否可以得到与上面描述的完全一样的输出,但你可以做一些类似的事情,如下所示。

import sys, inspect

class Suits(Enum):
    CLUBS = "CLUBS"
    DIAMONDS = "DIAMONDS"
    HEARTS = "HEARTS"
    SPADES = "SPADES"

example = Suits
members_str = [attr for attr in dir(example) if not callable(getattr(example, attr)) and not attr.startswith("__")]

#print(members_str) = ['CLUBS', 'DIAMONDS', 'HEARTS', 'SPADES']

members = []
for member in members:
     members.append(getattr(Suits, member))
#here are a couple of different options:

#option1:
output = Literal[members]
#output = typing.Literal[[<Suits.CLUBS: 'CLUBS'>, <Suits.DIAMONDS: 'DIAMONDS'>, <Suits.HEARTS: 'HEARTS'>, <Suits.SPADES: 'SPADES'>]]
#option2:
output = []
for member in members:
   output.append(Literal[member])
#member = [typing.Literal[<Suits.CLUBS: 'CLUBS'>], typing.Literal[<Suits.DIAMONDS: 'DIAMONDS'>], typing.Literal[<Suits.HEARTS: 'HEARTS'>], typing.Literal[<Suits.SPADES: 'SPADES'>]]

从我所见,你不能预先定义一个文字数组,它几乎必须是手动的。 不幸的是,这些都不等于上面的Suit = Literal[Suits.CLUBS, Suits.DIAMONDS, Suits.HEARTS, Suits.SPADES]

我建议考虑为你的程序做一个 C 包装器。 我这样说的原因是因为这将是一个完全可行的功能,正如我将在下面展示的一些伪 C 代码中:

//if Literal is an already previously defined type
//output an array with a set length that is a literal array

Literal* to_litteral_array(individual_type* types, int number_of_individual_types){
        Literal* output = (Literal*)malloc(sizeof(Literal) * number_of_individual_types);
        for(int i = 0; i < number_of_individual_types; i++){
               output[i] = to_literal(types[i])
        }
        return output;
}

显然它不会完全是这样,但是可能有一种方法可以在 C 中完成它,然后将它包装到一个 python 对象中。

当然,您也可以在 C 中创建一个枚举,这可能更容易。

希望这些答案之一有所帮助!

我认为最清晰易读的方法如下:

enum_values_str = [suit.value for suit in Suits]

value直接为您提供枚举的值,在您的情况下它是一个字符串。 否则,您可以执行str(suit.value)将其转换为字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM