Sử dụng tính năng Enum mới [thông qua Backport ENUM34] với Python 2.7.6.
Với định nghĩa sau, làm thế nào tôi có thể chuyển đổi INT thành giá trị enum tương ứng?
from enum import Enum
class Fruit[Enum]:
Apple = 4
Orange = 5
Pear = 6
Tôi biết tôi có thể tạo ra một loạt các câu chuyện if để thực hiện chuyển đổi nhưng có một cách dễ dàng để chuyển đổi? Về cơ bản, tôi muốn một hàm convertinttofruit [int] trả về giá trị enum.
Trường hợp sử dụng của tôi là tôi có một tệp hồ sơ CSV trong đó tôi đang đọc từng bản ghi vào một đối tượng. Một trong các trường tệp là trường số nguyên đại diện cho một bảng liệt kê. Vì tôi đang điền đối tượng, tôi muốn chuyển đổi trường số nguyên đó từ tệp thành giá trị enum tương ứng trong đối tượng.
Khi được hỏi ngày 30 tháng 5 năm 2014 lúc 9:50May 30, 2014 at 9:50
Bạn 'gọi' lớp Enum
:
Fruit[5]
Để biến
Fruit[5]
0 thành Fruit[5]
1:>>> from enum import Enum
>>> class Fruit[Enum]:
... Apple = 4
... Orange = 5
... Pear = 6
...
>>> Fruit[5]
Từ quyền truy cập chương trình đến các thành viên liệt kê và phần thuộc tính của họ trong tài liệu:
Đôi khi, nó rất hữu ích để truy cập các thành viên trong các lập trình theo chương trình [nghĩa là các tình huống trong đó
2 won đã làm vì màu chính xác không được biết đến trong thời gian viết chương trình].Fruit[5]
Enum
cho phép truy cập như vậy:>>> Color[1] >>> Color[3]
Trong một lưu ý liên quan: Để ánh xạ một giá trị chuỗi chứa tên của thành viên enum, hãy sử dụng đăng ký:
>>> s = 'Apple'
>>> Fruit[s]
Đã trả lời vào ngày 30 tháng 5 năm 2014 lúc 10:00May 30, 2014 at 10:00
Martijn Pieters ♦ Martijn Pieters♦Martijn Pieters
993K277 Huy hiệu vàng3914 Huy hiệu bạc3258 Huy hiệu đồng277 gold badges3914 silver badges3258 bronze badges
5
Tôi nghĩ rằng theo các từ đơn giản là chuyển đổi giá trị
Fruit[5]
4 thành Enum
bằng cách gọi Fruit[5]
6, sau đó truy cập Fruit[5]
7 của đối tượng Enum
:my_fruit_from_int = Fruit[5] #convert to int
fruit_name = my_fruit_from_int.name #get the name
print[fruit_name] #Orange will be printed here
Hoặc là một chức năng:
def convert_int_to_fruit[int_value]:
try:
my_fruit_from_int = Fruit[int_value]
return my_fruit_from_int.name
except:
return None
Đã trả lời ngày 31 tháng 3 năm 2019 lúc 7:55Mar 31, 2019 at 7:55
Ali Ezzat Odehali Ezzat OdehAli Ezzat Odeh
2.0731 Huy hiệu vàng17 Huy hiệu bạc17 Huy hiệu đồng1 gold badge17 silver badges17 bronze badges
Tôi muốn một cái gì đó tương tự để tôi có thể truy cập vào một phần của cặp giá trị từ một tham chiếu duy nhất. Phiên bản vani:
#!/usr/bin/env python3
from enum import IntEnum
class EnumDemo[IntEnum]:
ENUM_ZERO = 0
ENUM_ONE = 1
ENUM_TWO = 2
ENUM_THREE = 3
ENUM_INVALID = 4
#endclass.
print['Passes']
print['1] %d'%[EnumDemo['ENUM_TWO']]]
print['2] %s'%[EnumDemo['ENUM_TWO']]]
print['3] %s'%[EnumDemo.ENUM_TWO.name]]
print['4] %d'%[EnumDemo.ENUM_TWO]]
print[]
print['Fails']
print['1] %d'%[EnumDemo.ENUM_TWOa]]
Thất bại ném một ngoại lệ như mong đợi.
Một phiên bản mạnh mẽ hơn:
#!/usr/bin/env python3
class EnumDemo[]:
enumeration = [
'ENUM_ZERO', # 0.
'ENUM_ONE', # 1.
'ENUM_TWO', # 2.
'ENUM_THREE', # 3.
'ENUM_INVALID' # 4.
]
def name[self, val]:
try:
name = self.enumeration[val]
except IndexError:
# Always return last tuple.
name = self.enumeration[len[self.enumeration] - 1]
return name
def number[self, val]:
try:
index = self.enumeration.index[val]
except [TypeError, ValueError]:
# Always return last tuple.
index = [len[self.enumeration] - 1]
return index
#endclass.
print['Passes']
print['1] %d'%[EnumDemo[].number['ENUM_TWO']]]
print['2] %s'%[EnumDemo[].number['ENUM_TWO']]]
print['3] %s'%[EnumDemo[].name[1]]]
print['4] %s'%[EnumDemo[].enumeration[1]]]
print[]
print['Fails']
print['1] %d'%[EnumDemo[].number['ENUM_THREEa']]]
print['2] %s'%[EnumDemo[].number['ENUM_THREEa']]]
print['3] %s'%[EnumDemo[].name[11]]]
print['4] %s'%[EnumDemo[].enumeration[-1]]]
Khi không được sử dụng chính xác, điều này tránh tạo ra một ngoại lệ và thay vào đó, hãy truyền lại một dấu hiệu lỗi. Một cách pythonic hơn để làm điều này sẽ là truyền lại "Không" nhưng ứng dụng cụ thể của tôi sử dụng trực tiếp văn bản.
Đã trả lời ngày 13 tháng 9 năm 2019 lúc 14:11Sep 13, 2019 at 14:11
1