Tôi đang sử dụng thư viện Enum4 để tạo một lớp enum như sau:
class Color(Enum):
RED = 1
BLUE = 2
Tôi muốn in [1, 2]
như một danh sách ở đâu đó. Làm thế nào tôi có thể đạt được điều này?
Tôi đang sử dụng thư viện Enum4 để tạo một lớp enum như sau:
class Color(Enum):
RED = 1
BLUE = 2
Tôi muốn in [1, 2]
như một danh sách ở đâu đó. Làm thế nào tôi có thể đạt được điều này?
Câu trả lời:
Bạn có thể sử dụng IntEnum :
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
print(int(Color.RED)) # prints 1
Để có được danh sách các số nguyên:
enum_list = list(map(int, Color))
print(enum_list) # prints [1, 2]
a = [(int(v), str(v)) for v in Color]
và sau đó print(a)
.
[(color.value, color.name) for color in Color]
Để sử dụng Enum với bất kỳ loại giá trị nào, hãy thử điều này: Được
cập nhật với một số cải tiến ... Cảm ơn @Jeff, bằng mẹo của bạn!
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 'GREEN'
BLUE = ('blue', '#0000ff')
@staticmethod
def list():
return list(map(lambda c: c.value, Color))
print(Color.list())
Kết quả là:
[1, 'GREEN', ('blue', '#0000ff')]
@classmethod
sẽ yêu cầu tạo thể hiện của Color
lớp. Đó là lý do tại sao staticmethod
dường như là lựa chọn chính xác ở đây.
@classmethod
và sử dụng return list(map(lambda c: c.value, cls))
thay thế.
Dựa trên câu trả lời của @Jeff, tái cấu trúc để sử dụng một classmethod
để bạn có thể sử dụng lại cùng một mã cho bất kỳ enum nào của bạn:
from enum import Enum
class ExtendedEnum(Enum):
@classmethod
def list(cls):
return list(map(lambda c: c.value, cls))
class OperationType(ExtendedEnum):
CREATE = 'CREATE'
STATUS = 'STATUS'
EXPAND = 'EXPAND'
DELETE = 'DELETE'
print(OperationType.list())
Sản xuất:
['CREATE', 'STATUS', 'EXPAND', 'DELETE']
lớp enum.Enum
là một lớp giải quyết tất cả các nhu cầu liệt kê của bạn, vì vậy bạn chỉ cần kế thừa từ nó và thêm các trường của riêng bạn. Rồi từ đó trở đi, tất cả những gì bạn cần làm là chỉ gọi các thuộc tính của nó: name
& value
:
from enum import Enum
class Letter(Enum):
A = 1
B = 2
C = 3
print({i.name: i.value for i in Letter})
# prints {'A': 1, 'B': 2, 'C': 3}
Vì vậy, Enum
có một __members__
dict. Giải pháp mà @ozgur đề xuất thực sự là tốt nhất, nhưng bạn có thể làm điều này, thực hiện điều tương tự, với nhiều công việc hơn
[color.value for color_name, color in Color.__members__.items()]
Các __members__
từ điển có thể có ích nếu bạn muốn chèn thứ tự động ở trong đó ... trong một số tình huống điên.
[EDIT]
Rõ ràng__members__
không phải là một từ điển, mà là một proxy bản đồ. Điều đó có nghĩa là bạn không thể dễ dàng thêm các mục vào nó.
Tuy nhiên, bạn có thể làm những thứ kỳ lạ như MyEnum.__dict__['_member_map_']['new_key'] = 'new_value'
, và sau đó bạn có thể sử dụng khóa mới như MyEnum.new_key
.... nhưng đây chỉ là một chi tiết triển khai và không nên chơi. Ma thuật đen được trả cho chi phí bảo trì rất lớn.
__members__
? Đó sẽ là một cách thú vị để cho phép các tiện ích mở rộng từ đó tạo ra các Enum
thành viên mới . ... btw, được nâng cấp để mang thuộc tính mới ( cho tôi ) vào bảng.
Sử dụng _member_names_
cho một kết quả dễ dàng nhanh chóng nếu nó chỉ là tên, tức là
Color._member_names_
Ngoài ra, bạn có _member_map_
trả về một từ điển theo thứ tự của các yếu tố. Hàm này trả về a collections.OrderedDict
, vì vậy bạn có Color._member_names_.items()
và Color._member_names_.values()
chơi với. Ví dụ
return list(map(lambda x: x.value, Color._member_map_.values()))
sẽ trả về tất cả các giá trị hợp lệ của Màu
bạn có thể sử dụng hàm iter ():
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
l=[]
for i in iter(Color):
l.append(i.value)
print(l)