Tôi có một enum được định nghĩa như thế này:
def enum(**enums): return type('Enum', (), enums) Status = enum( STATUS_OK=0, STATUS_ERR_NULL_POINTER=1, STATUS_ERR_INVALID_PARAMETER=2)Tôi có một chức năng trả về trạng thái là >>> cur_status = get_Status() >>> print(cur_status) 1 1 enum. Làm thế nào tôi có thể lấy tên của giá trị enum, và không chỉ giá trị?
>>> cur_status = get_Status() >>> print(cur_status) 1Tôi muốn nhận >>> cur_status = get_Status() >>> print(cur_status) 1 2, thay vì >>> cur_status = get_Status() >>> print(cur_status) 1 3
Martineau
Huy hiệu vàng 116K2525 gold badges161 silver badges288 bronze badges
Hỏi ngày 26 tháng 4 năm 2015 lúc 16:32Apr 26, 2015 at 16:32
1
Bạn sẽ phải lặp qua các thuộc tính lớp để tìm tên phù hợp:
name = next(name for name, value in vars(Status).items() if value == 1)Các vòng biểu thức của trình tạo trên các thuộc tính và giá trị của chúng (được lấy từ từ điển được tạo bởi hàm >>> cur_status = get_Status() >>> print(cur_status) 1 4) sau đó trả về giá trị đầu tiên phù hợp với giá trị >>> cur_status = get_Status() >>> print(cur_status) 1 3.
Việc liệt kê được mô hình hóa tốt hơn bởi thư viện >>> cur_status = get_Status() >>> print(cur_status) 1 6, có sẵn trong Python 3.4 hoặc làm backport cho các phiên bản trước:
from enum import Enum class Status(Enum): STATUS_OK = 0 STATUS_ERR_NULL_POINTER = 1 STATUS_ERR_INVALID_PARAMETER = 2cho bạn quyền truy cập vào tên và giá trị:
name = Status(1).name # gives 'STATUS_ERR_NULL_POINTER' value = Status.STATUS_ERR_NULL_POINTER.value # gives 1Đã trả lời ngày 26 tháng 4 năm 2015 lúc 16:36Apr 26, 2015 at 16:36
Martijn Pieters ♦ Martijn Pieters♦Martijn Pieters
998K280 Huy hiệu vàng3925 Huy hiệu bạc3264 Huy hiệu đồng280 gold badges3925 silver badges3264 bronze badges
0
Cập nhật 2021: Những câu trả lời này đã hết hạn. Sử dụng lớp enum tiêu chuẩn của Python,
cur_status.namesẽ trả lại tên. (Status_err_null_pulum)
Để tìm kiếm sự biết tên:
s = Status['STATUS_ERR_NULL_POINTER']Đã trả lời ngày 17 tháng 3 năm 2021 lúc 13:19Mar 17, 2021 at 13:19
Gerardwgerardwgerardw
5.42143 Huy hiệu bạc38 Huy hiệu đồng43 silver badges38 bronze badges
3
Không chắc nó được giới thiệu phiên bản Python nào, nhưng thuộc tính ẩn >>> cur_status = get_Status() >>> print(cur_status) 1 7 cung cấp cho bạn những gì bạn muốn.
class Status(Enum): STATUS_OK=0 STATUS_ERR_NULL_POINTER=1 STATUS_ERR_INVALID_PARAMETER=2 str(Status._value2member_map_[1])Out:
'Status.STATUS_ERR_NULL_POINTER'Đã trả lời ngày 24 tháng 10 năm 2020 lúc 0:16Oct 24, 2020 at 0:16
DeusxmachinadeusxmachinaDeusXMachina
1.1721 Huy hiệu vàng15 Huy hiệu bạc26 Huy hiệu đồng1 gold badge15 silver badges26 bronze badges
3
Bạn không cần phải lặp qua lớp enum nhưng chỉ cần truy cập _member_map_.
>>> Status._member_map_['STATUS_OK'] <Status.STATUS_OK: 0>Đã trả lời ngày 8 tháng 5 năm 2020 lúc 7:52May 8, 2020 at 7:52
TechneerTechneertechneer
1371 Huy hiệu bạc6 Huy hiệu đồng1 silver badge6 bronze badges
3
Vì một số lý do, hầu hết các phương pháp trên không hoạt động với tôi. Tất cả các phương thức trả về loại enum dưới dạng số nguyên. Tôi đang làm việc với Python 3.7.
Trong giải pháp của tôi, tôi đã xác định chức năng lớp để xử lý việc này. Nó không hoàn toàn là Pythonic, nhưng hoạt động đủ tốt cho trường hợp của tôi.
>>> cur_status = get_Status() >>> print(cur_status) 1 0Bản in: >>> cur_status = get_Status() >>> print(cur_status) 1 8
Có vẻ như rõ ràng là chúng tôi đã yêu cầu trạng thái sau khi cho nó trạng thái, nhưng trong trường hợp của tôi, điều này được đặt theo chương trình ở nơi khác
Đã trả lời ngày 9 tháng 6 năm 2021 lúc 21:57Jun 9, 2021 at 21:57
RexbarkerrexbarkerRexBarker
1.14813 Huy hiệu bạc12 Huy hiệu đồng13 silver badges12 bronze badges