2016-08-04 11 views
5

क्या मैं एक enum नामक 'कोई नहीं' नाम जोड़ सकता हूं? उदाहरण क्या एनम प्रकार के लिए 'कोई नहीं' नाम का मूल्य जोड़ना संभव है?

from enum import Enum 
class Color(Enum): 
    None=0 #represent no color at all 
    red = 1 
    green = 2 
    blue = 3 

color=Color.None 

if (color==Color.None): 
    #don't fill the rect 
else: 
    #fill the rect with the color 

यह सवाल मेरे पिछले प्रश्न How to set a variable's subproperty?

बेशक

से संबंधित है के लिए , मैं समझता हूँ ऊपर Noneenum में काम नहीं करता। लेकिन विक्रेता के कोड से, मैं कुछ इस तरह देख पा रहे हैं: bird.eye.Color=bird.eye.Color.enum.None मैं type(bird.eye.Color) जाँच की यह एक <class 'flufl.enum._enum.IntEnumValue'> तो एक flufl.enum प्रयोग किया जाता है। मुझे लगता है कि flufl.enum या Enum का उपयोग करने के लिए यह बहुत अलग नहीं होना चाहिए। बहुत बहुत धन्यवाद!

+0

जब आपने उपर्युक्त कोड की कोशिश की तो क्या हुआ? क्या आपको एक त्रुटि संदेश मिला? –

+2

आप किसी कीवर्ड को असाइन नहीं कर सकते हैं। 'None = *' 'सिंटेक्स त्रुटि 'फेंक देगा, लेकिन आप' none = * 'का उपयोग कर सकते हैं। – Pythonista

+0

@ पायथनिस्ट कोई भी बनाम कोई नहीं है। – sawreals

उत्तर

1

आप Enum निर्माता का उपयोग कर के बजाय एक उपवर्ग बनाने यह कर सकते हैं

>>> from enum import Enum 
>>> 
>>> Color = Enum('Color', {'None': 0, 'Red': 1, 'Green': 2, 'Blue': 3}) 
>>> Color.None 
<Color.None: 0 

संपादित करें: यह अजगर 2 के लिए enum34 backport का उपयोग कर अजगर 3 में काम करता है, आप के साथ Enum बनाने में सक्षम हो जाएगा None विशेषता, लेकिन आप डॉट नोटेशन का उपयोग करने में सक्षम नहीं होंगे।

>>> Color.None 
SyntaxError: invalid syntax 

अजीब तरह, आप अभी भी getattr

>>> getattr(Color, 'None') 
<Color.None: 0> 
+0

में काम करता है यह केवल पायथन 2 में संभव है क्योंकि वे 'कोई नहीं' नाम से अधिक क्षमा कर रहे थे (यह 'keyword.kwlist' में मौजूद नहीं है)। यह पायथन 3 में टूट गया है। – wim

+0

@ विम हाँ, मैंने 'enum34' बैकपोर्ट का उपयोग किया। हालांकि यह थोड़ा अजीब है, क्योंकि पायथन 3 में, यह एनम सृजन को 'कोई नहीं' के साथ अनुमति देगा, लेकिन यह 'Color.None' के साथ इसे एक्सेस करने का प्रयास करते समय त्रुटिपूर्ण हो जाता है। आप अभी भी 'getattr (रंग, 'कोई नहीं') कर सकते हैं। –

+0

वास्तव में अजीब नहीं है - इसी तरह का व्यवहार अजगर 2 में भी मौजूद है। उदाहरण के लिए, आप 'setattr (my_obj,' import ', 123) कर सकते हैं। लेकिन आप एक ऐसी विशेषता क्यों सेट करना चाहेंगे जिसे आप सामान्य विशेषता पहुंच के साथ प्राप्त नहीं कर सकते? ऐसा करने के लिए केवल नुकसान है .. – wim

-2

नहीं काफी जिस तरह से आप की कोशिश की है, लेकिन आप यह कर सकते हैं:

# After defining the class Color as normal, but excluding the part for None... 
setattr(Color, 'None', 0) 

color = Color.None 
if color == Color.None: 
    ... 

नोट: मुझे यकीन है कि नहीं आप या अजगर 2 में यह चाहते हैं 3 अगर क्योंकि आप निर्दिष्ट नहीं किया अजगर 2 में ऐसा किया , और मेरे पास परीक्षण करने के लिए इस मशीन पर स्थापित पायथन 3 की एक प्रति नहीं है।

+2

आप कर सकते हैं, लेकिन आपको नहीं करना चाहिए। – SuperSaiyan

+1

विस्तृत करने के लिए, यह एनम क्लास करता है कि मेटाक्लास जादू को हटा देता है, इसलिए यह enum का उचित सदस्य नहीं होगा।इसके कई दुर्भाग्यपूर्ण साइड इफेक्ट्स हैं, उदाहरण के लिए 'सूची (रंग)' में दिखाई नहीं देगा, कोई टक्कर रोकथाम या एलियासिंग संभव नहीं है, आदि – wim

+0

@ विम - क्या यह पायथन 3 में मानक मॉड्यूल है? मैंने सोचा कि ओपी ने 'पीआईपी' का उपयोग करके 'एनम' नामक कुछ स्थापित किया था। वैसे भी, मुझे यकीन है कि हम जादू के सभी काम करने के लिए कुछ कर सकते हैं। – ArtOfWarfare

1

के साथ उपयोग कर सकते हैं आप इस सीधे नहीं कर सकते क्योंकि यह None को आवंटित करने के लिए एक सिंटैक्स त्रुटि है।

न तो आप अपने एनम कक्षा पर गतिशील रूप से एक विशेषता सेट कर सकते हैं, क्योंकि यह मेटाक्लास तर्क में हस्तक्षेप करेगा कि Enum आपकी कक्षा तैयार करने के लिए उपयोग करता है।

आपको पाइथन के None सिंगलटन के साथ नाम टकराव से बचने के लिए केवल लोअरकेस नाम none का उपयोग करना चाहिए। उपयोग के मामले के लिए आपने वर्णन किया है, इस दृष्टिकोण के लिए कोई नुकसान नहीं है।

+0

ब्रेंडन हाबेल का जवाब ऐसा लगता है कि यह संभवतः मेरे जैसे दुष्प्रभावों के बिना काम करता है। – ArtOfWarfare

+0

नहीं। दुष्प्रभाव यह है कि यह python3 में काम नहीं करता है। – wim

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