enum - รับค่า enum จากการแปลงสตริง


111

ฉันได้กำหนด enum ดังต่อไปนี้

from enum import Enum


class D(Enum):
    x = 1
    y = 2


print(D.x)

ตอนนี้ค่าที่พิมพ์คือ

D.x

ฉันต้องการให้พิมพ์ค่า enum แทน

1

จะทำอย่างไรเพื่อให้บรรลุฟังก์ชันนี้?


1
ฉันควรชี้แจงพารามิเตอร์การเข้าถึงฉันรู้สิ่ง Dxvalue สิ่งที่ฉันต้องการคือการแปลงสตริง Dx เพื่อส่งคืนค่าขออภัยหากคำถามไม่ได้ทำให้เงื่อนไขชัดเจน
Vaibhav Mishra

คำตอบ:


191

คุณกำลังพิมพ์ enum วัตถุ ใช้.valueแอตทริบิวต์หากคุณต้องการเพียงแค่พิมพ์:

print(D.x.value)

ดูการเข้าถึงโปรแกรมให้กับสมาชิกในการนับและคุณลักษณะของพวกเขาส่วน :

หากคุณมีสมาชิก enum และต้องการชื่อหรือค่า:

>>>
>>> member = Color.red
>>> member.name
'red'
>>> member.value
1

คุณสามารถเพิ่ม__str__วิธีการลงใน enum ของคุณได้หากคุณต้องการเพียงแค่ระบุการแสดงสตริงที่กำหนดเอง:

class D(Enum):
    def __str__(self):
        return str(self.value)

    x = 1
    y = 2

การสาธิต:

>>> from enum import Enum
>>> class D(Enum):
...     def __str__(self):
...         return str(self.value)
...     x = 1
...     y = 2
... 
>>> D.x
<D.x: 1>
>>> print(D.x)
1

เมื่อฉันเปรียบเทียบกับค่าจำนวนเต็มมันจะส่งกลับเป็นวัตถุ เช่น: if D.x == 10: .... ฉันควรใช้แนวทางใดสำหรับจำนวนเต็ม?
alper

@alper: เหมือนกันทุกประการ; D.xคือวัตถุ enum D.x.valueเป็นค่าจำนวนเต็ม หากคุณต้องมีค่า enum ทำหน้าที่เหมือนจำนวนเต็มให้ใช้IntEnumประเภทโดยที่แต่ละองค์ประกอบเป็นคลาสย่อยintและIntEnumD.x == 10จะได้ผล
Martijn Pieters

ฉันได้เพิ่ม def __eq__(self, other): return int(self.value) == otherแล้วdef __int__(self): return int(self.value)แต่ก็ยังคิดว่าต้องใช้.valueกับกรณีที่ไม่ได้ใช้การเปรียบเทียบ
alper

@alper: __eq__การนำไปใช้ไม่ได้ผลเมื่อotherเป็นค่า enum อื่น D.x == D.yที่ไหนD.x.value == D.y.valueจะจริงก็จะล้มเหลวเช่น ดูเหมือนว่าคุณต้องการใช้IntEnumแทนที่Enumนั่น
Martijn Pieters

8

ฉันดำเนินการเข้าถึงโดยใช้สิ่งต่อไปนี้

class D(Enum):
    x = 1
    y = 2

    def __str__(self):
        return '%s' % self.value

ตอนนี้ฉันทำได้แล้ว

print(D.x)เพื่อให้ได้1ผลลัพธ์

นอกจากนี้คุณยังสามารถใช้self.nameในกรณีที่คุณต้องการที่จะพิมพ์แทนx1


2
ทำไมต้องจัดรูปแบบสตริงและself._value_? return str(self.value)ตรงไปตรงมามากขึ้น
Martijn Pieters

1
ฉันแค่ดูที่มาและนี่คือวิธีการใช้งานอย่างไรก็ตามคุณถูกต้องและself.valueสะอาดกว่า
Vaibhav Mishra

3
แอตทริบิวต์ขีดล่างเดียวอยู่ภายในคลาส enum ที่สร้างขึ้น ควรยึดติดกับแอตทริบิวต์ที่บันทึกไว้ (ซึ่งเป็นตัวบ่งชี้พิเศษเพื่อให้คุณยังคงสามารถใช้valueเป็นชื่อในประเภท enum ของคุณได้)
Martijn Pieters

@MartijnPieters เห็นด้วย
Vaibhav Mishra

0

ฉันพบหน้านี้เมื่อค้นหาการเข้าถึงEnumโดยใช้สตริง ฉันรู้ว่านี่ไม่ใช่สิ่งที่ถูกถามในคำถามอนุภาคนี้ แต่ชื่อนั้น "แนะนำ"

ในการรับ Enum โดยใช้ String คุณสามารถทำสิ่งต่อไปนี้:

from enum import Enum


class D(Enum):
    x = 1
    y = 2


print(D["x"])  # <D.x: 1>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.