अजगर एनम वर्ग से सभी मान कैसे प्राप्त करें?


140

मैं Enum4 पुस्तकालय का उपयोग कर रहा हूँ एक एनम वर्ग बनाने के लिए निम्नानुसार है:

class Color(Enum):
    RED = 1
    BLUE = 2

मैं [1, 2]कहीं सूची के रूप में छापना चाहता हूं । इसे कैसे प्राप्त किया जा सकता है?

जवाबों:


48

आप IntEnum का उपयोग कर सकते हैं :

from enum import IntEnum

class Color(IntEnum):
   RED = 1
   BLUE = 2


print(int(Color.RED))   # prints 1

किलों की सूची प्राप्त करने के लिए:

enum_list = list(map(int, Color))
print(enum_list) # prints [1, 2]

आप थर्ड पार्टी एक का उपयोग करें। लेकिन यह भी कहते हैं कि यह intenum है
मार्सिन

मैं कैसे प्रिंट करता हूं [(1, 'RED'), (2, 'BLUE')]
user1159517

इसके बारे में क्या: a = [(int(v), str(v)) for v in Color]और फिर print(a)
मार्सिन

34
इसके बारे में कैसे:[(color.value, color.name) for color in Color]
vlad-ardelean

2
@ व्लाद-अर्देलियन की टिप्पणी सबसे अच्छा और सबसे अधिक आकर्षक है। यह
एनुम

431

आप निम्न कार्य कर सकते हैं:

[e.value for e in Color]

1
@ user2340939 यह एनम की सूची लौटाता है, मूल्यों की सूची नहीं। यदि आप उस के साथ आया हो, तो आप के रूप में अच्छी इस्तेमाल कर सकते हैंlist(Color)
endolith

1
इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए।
SKYFALL26

22

किसी भी प्रकार के मूल्य के साथ Enum का उपयोग करने के लिए, यह प्रयास करें:
कुछ सुधार के साथ अपडेट किया गया ... धन्यवाद @Jeff, आपके टिप से!

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

परिणाम के रूप में:

[1, 'GREEN', ('blue', '#0000ff')]

6
मैं @ staticassethod के बजाय @classmethod का उपयोग करूंगा
ISONecroMAn

1
@ISONecroMAn मुझे लगता है कि कक्षा का @classmethodउदाहरण बनाना होगा Color। यही कारण है कि staticmethodयहाँ सही विकल्प लगता है।
लियोनिद डैशको

@LeonidDashko बिल्कुल नहीं। मेरा जवाब देखिए।
ब्लूफैस्ट

@LeonidDashko @dangoonfast सही है। आप इसके बजाय उपयोग @classmethodऔर उपयोग कर सकते हैं return list(map(lambda c: c.value, cls))
रिप्टीडे ४

18

@ जेफ के जवाब के आधार पर, classmethodताकि आप अपने किसी भी दूत के लिए एक ही कोड का पुन: उपयोग कर सकें , का उपयोग करने के लिए रद्द कर दिया गया :

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

पैदा करता है:

['CREATE', 'STATUS', 'EXPAND', 'DELETE']

7

वर्ग enum.Enumएक ऐसा वर्ग है जो आपकी सभी गणना की आवश्यकता को हल करता है, इसलिए आपको बस इसे से विरासत में प्राप्त करने की आवश्यकता है, और अपने स्वयं के क्षेत्रों को जोड़ें। फिर तब से, आपको बस इतना करना है कि इसे कॉल करना है गुण: 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}

6

तो Enumएक __members__हुक्म है। @Ozgur ने जो समाधान प्रस्तावित किया है, वह वास्तव में सबसे अच्छा है, लेकिन आप ऐसा कर सकते हैं, जो एक ही काम करता है, अधिक काम के साथ

[color.value for color_name, color in Color.__members__.items()]

__members__शब्दकोश काम में आ अगर आप इसे में गतिशील रूप से सामान डालने के लिए ... कुछ पागल स्थिति में चाहता था सकता है।

[संपादित करें] स्पष्ट रूप __members__से एक शब्दकोश नहीं है, लेकिन एक नक्शा प्रॉक्सी है। जिसका अर्थ है कि आप इसमें आसानी से आइटम नहीं जोड़ सकते।

आप हालांकि अजीब तरह की चीजें MyEnum.__dict__['_member_map_']['new_key'] = 'new_value'कर सकते हैं, और फिर आप नई कुंजी का उपयोग कर सकते हैं जैसे MyEnum.new_key.... लेकिन यह सिर्फ एक कार्यान्वयन विवरण है, और इसके साथ नहीं खेला जाना चाहिए। विशाल रखरखाव लागत के साथ काले जादू का भुगतान किया जाता है।


बस एक साइडबार: आइटम को जोड़ा जा सकता है __members__? यह एक्सटेंशन का एक दिलचस्प तरीका है जिससे नए Enumसदस्य बनाए जा सकते हैं। ... टेबल पर एक नया ( मेरे लिए ) विशेषता लाने के लिए अपडाउन किया गया btw ।
इब्रेट

@ आईब्रेट: नहीं, यह अस्वीकृत है। यदि कोई Enum निर्मित होने के बाद सदस्यों को जोड़ने / घटाने का एक तरीका निकालता है तो वे संभवतः उस Enum को तोड़ देंगे।
एथन फुरमैन

@ आईब्रेट: इस तथ्य के बाद नए सदस्य जोड़ें कि आमतौर पर यह एक अच्छा विचार नहीं है। यदि आप वास्तव में चाहते हैं, तो इस उत्तर को देखें
एथन फुरमान

1

_member_names_एक त्वरित आसान परिणाम के लिए उपयोग करें अगर यह सिर्फ नाम है, यानी

Color._member_names_

इसके अलावा, आपके पास _member_map_तत्वों का एक ऑर्डर किया गया शब्दकोश है। यह फ़ंक्शन एक रिटर्न देता है collections.OrderedDict, इसलिए आपके पास है Color._member_names_.items()और इसके Color._member_names_.values()साथ खेलना है। उदाहरण के लिए

return list(map(lambda x: x.value, Color._member_map_.values()))

रंग के सभी वैध मान लौटाएगा


-1

आप iter () फ़ंक्शन का उपयोग कर सकते हैं:

from enum import IntEnum

class Color(IntEnum):
   RED = 1
   BLUE = 2
l=[]
for i in iter(Color):
    l.append(i.value)
print(l)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.