enum - nhận giá trị của enum khi chuyển đổi chuỗi


108

Tôi đã định nghĩa enum sau đây

from enum import Enum


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


print(D.x)

bây giờ giá trị được in là

D.x

thay vào đó tôi muốn giá trị của enum được in

1

Có thể làm gì để đạt được chức năng này?


1
Tôi nên làm rõ các tham số truy cập, tôi biết điều Dxvalue, những gì tôi muốn là chuyển đổi chuỗi Dx để trả về giá trị, xin lỗi nếu câu hỏi không làm rõ điều kiện.
Vaibhav Mishra

Câu trả lời:


188

Bạn đang in đối tượng enum . Sử dụng .valuethuộc tính nếu bạn chỉ muốn in:

print(D.x.value)

Xem các truy cập theo chương trình cho các thành viên liệt kê và các thuộc tính của họ phần :

Nếu bạn có một thành viên enum và cần tên hoặc giá trị của nó:

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

Bạn có thể thêm một __str__phương thức vào enum của mình, nếu tất cả những gì bạn muốn là cung cấp một biểu diễn chuỗi tùy chỉnh:

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

    x = 1
    y = 2

Bản giới thiệu:

>>> 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

Khi tôi so sánh nó với một giá trị số nguyên, nó trả về dưới dạng đối tượng. Ví dụ: if D.x == 10: .... Tôi nên thực hiện cách tiếp cận nào đối với số nguyên?
alper

@alper: giống hệt như vậy; D.xlà đối tượng enum, D.x.valuelà một giá trị nguyên. Nếu bạn phải có các giá trị enum hoạt động giống như số nguyên, hãy sử dụng IntEnumkiểu , trong đó mỗi phần tử là một lớp con của intvà như vậy IntEnumD.x == 10sẽ hoạt động.
Martijn Pieters

Tôi đã thêm def __eq__(self, other): return int(self.value) == otherdef __int__(self): return int(self.value)nhưng tôi vẫn nghĩ rằng tôi phải sử dụng .valuetrong các trường hợp khi tôi không sử dụng so sánh
alper

@alper: việc __eq__triển khai đó không hoạt động khi otherlà một giá trị enum khác; D.x == D.y, D.x.value == D.y.valueví dụ như đúng, sẽ thất bại. Có vẻ như bạn muốn sử dụng IntEnumthay vì Enumở đó.
Martijn Pieters

7

Tôi đã triển khai quyền truy cập bằng cách sử dụng sau

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

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

bây giờ tôi có thể làm

print(D.x)để có được 1kết quả.

Bạn cũng có thể sử dụng self.nametrong trường hợp bạn muốn in xthay vì 1.


2
Tại sao phải định dạng chuỗi và self._value_? return str(self.value)là đơn giản hơn.
Martijn Pieters

1
Tôi chỉ xem nguồn và đây là cách nó được thực hiện, tuy nhiên bạn đã đúng và rõ ràng self.valuehơn.
Vaibhav Mishra

3
Các thuộc tính dấu gạch dưới đơn nằm trong lớp enum đã tạo; tốt hơn nên bám vào thuộc tính được tài liệu hóa (đây là một bộ mô tả đặc biệt để bạn vẫn có thể sử dụng valuelàm tên trên kiểu enum của mình).
Martijn Pieters

@MartijnPieters đồng ý
Vaibhav Mishra

0

Tôi tìm thấy trang này khi tìm kiếm để truy cập Enummột chuỗi bằng cách sử dụng một chuỗi. Tôi biết đây không phải là những gì đang được hỏi trong câu hỏi cụ thể này nhưng tiêu đề 'gợi ý' nó.

Để có được một Enum bằng cách sử dụng Chuỗi, bạn có thể làm như sau:

from enum import Enum


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


print(D["x"])  # <D.x: 1>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.