2015-04-07 6 views
37

मैं Enum4 पुस्तकालय का उपयोग कर रहा इस प्रकार एक enum वर्ग बनाने के लिए:पायथन एनम कक्षा से सभी मूल्य कैसे प्राप्त करें?

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

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

उत्तर

18

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

from enum import IntEnum 

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


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

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

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

क्या पुस्तकालय मैं IntEnum उपयोग करने के लिए स्थापित करने के लिए है? – user1159517

+0

enum का निर्माण इस प्रकार है: 'enum import IntEnum' – Marcin

+1

https://pypi.python.org/pypi/enum34 यह वह है जिसे मैं अभी उपयोग कर रहा हूं। – user1159517

126

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

[e.value for e in Color] 
1

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

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

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

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

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

+0

का बेवकूफ उपयोग है बस एक साइडबार: क्या आइटम '__members__' में जोड़ा जा सकता है? यह * एक्सटेंशन * को नए 'एनम' सदस्यों को बनाने की अनुमति देने का एक दिलचस्प तरीका होगा। ... बीटीडब्ल्यू, तालिका में एक नया (* मुझे * * विशेषता लाने के लिए ऊपर उठाया गया। – IAbstract

+0

@IAbstract: नहीं, यह अस्वीकृत है। अगर कोई एनम बनने के बाद सदस्यों को जोड़ने/घटाए जाने का तरीका समझता है तो वे शायद उस एनम को तोड़ देंगे। –

+0

@IAbstract: तथ्य के बाद नए सदस्यों को जोड़ें आमतौर पर एक अच्छा विचार नहीं है। यदि आप वास्तव में चाहते हैं, तो [यह उत्तर] देखें (http://stackoverflow.com/a/35899963/208880)। –

2

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

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')] 
+0

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

संबंधित मुद्दे