![](/img/trans.png)
[英]What is the most pythonic way to remove characters from a string and create substrings?
[英]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.