2017-01-18 6 views
7

मैं अब ~ 3 साल के लिए अजगर 2 कोड लिखने किया गया है, और हालांकि मैं एक लंबे समय के लिए enums के बारे में जानता हूं, हम उन्हें हमारे परियोजना में उपयोग प्रारंभ कर देते (बैकपोर्टेड - pypi पैकेज enum34)।पायथन में enums के लिए एक अच्छा उपयोग केस क्या है?

मैं चाहता समझने के लिए जब उन्हें इस्तेमाल करने के लिए।

एक जगह है जहाँ हम इनका उपयोग करना प्रारंभ अजगर enums के लिए कुछ postgres डेटाबेस स्तर enums मैप करने के लिए किया गया था।

if value == Status.active.value: 
    ... 

और इसलिए इस मामले में enums का उपयोग कर सिर्फ एक का उपयोग कर की तुलना में कम उपयोगी है: इसलिए हम जब इन का उपयोग कर इस enum वर्ग

class Status(enum.Enum): 
    active = 'active' 
    inactive = 'inactive' 

लेकिन तब तो हम उनका इस तरह का उपयोग कर समाप्त कर दिया अधिक सरल वर्ग, इस

class Status(object): 
    active = 'active' 
    inactive = 'inactive' 

की तरह हम इस और अधिक आसानी से value == Status.active की तरह इस्तेमाल कर सकते हैं क्योंकि,।

अब तक केवल जगह मैं इस उपयोगी पाया - हालांकि के रूप में उपयोगी नहीं के रूप में मैं चाहता हूँ - docstrings में है। स्पष्ट रूप से यह कहने के बजाय कि अनुमत मान 'सक्रिय' और 'निष्क्रिय' हैं, मैं केवल यह घोषणा कर सकता हूं कि मेरा औपचारिक पैरामीटर स्थिति एनम के सदस्य (अधिक स्थिति में अधिक सहायक होने पर) की अपेक्षा करता है

तो मैं वास्तव में नहीं गाँठ क्या उनके सटीक उपयोग के मामले में है - मुझे नहीं पता कि वे स्ट्रिंग स्थिरांक से बेहतर कैसे हैं।

संक्षेप में: enums का उपयोग कब करें?

+0

यदि आप तारों के लिए जाते हैं, तो आप डॉकस्ट्रिंग भी कह सकते हैं "वर्ग 'स्थिति' में परिभाषित स्थिरांक में से एक होना चाहिए। – 5gon12eder

+0

शीर्षक प्रश्न का उत्तर देने के लिए: [पायथन एनम, कब और कहां उपयोग करें?] (Http://stackoverflow.com/q/22586895/208880) –

उत्तर

3

एक जोड़े को अंक:

  • आप Enum वर्ग एक mixin के रूप में उपयोग कर सकते हैं str
  • कुछ डेटाबेस परतों पहला बिंदु के लिए

अजगर डेटा प्रकार में संग्रहीत डेटा को परिवर्तित करने की अनुमति कर रहे हैं :

class Status(str, Enum): 
    active = 'active' 
    inactive = 'inactive' 

... 

if value == Status.active: 
    ... 

दूसरे बिंदु के लिए:

मैं यहाँ छोटा सा अनुभव है, लेकिन मेरा मानना ​​है कि SQLAlchemy ऐसा करेंगे।

1

मैं जीयूआई डिजाइन में सबसे अधिक बार Enum का उपयोग करें। कल्पना करें कि आपके पास enter image description here

यह निश्चित विकल्पों की एक सूची का प्रतिनिधित्व करता है, इसलिए हुड के तहत, यह एनम द्वारा अच्छी तरह से प्रतिनिधित्व किया जाता है। यही है, यदि कोई उपयोगकर्ता बटन 2 चुनता है, तो Enum.Choice.Choice2 कुछ कॉलबैक द्वारा वापस किया जा सकता है। यह int 2 या "choice 2" स्ट्रिंग करने से बेहतर है, क्योंकि इन्हें बाद में सत्यापित करने के लिए कुछ भी नहीं है। दूसरे शब्दों में, यदि आपने "choice 2" से "user choice 2" बदल दिया है, तो आप मूल प्रतीक की उम्मीद कर रहे डाउनस्ट्रीम घटकों को संभावित रूप से तोड़ सकते हैं।

बॉयलरप्लेट ऑब्जेक्ट क्लास बनाने के बजाय, विकल्पों के एक स्थिर सेट को प्रस्तुत करने के लिए एनम के बारे में सोचें।

मुझे कुछ और उपयोगी होने के लिए जावा में एनम (और अन्य स्थिर रूप से टाइप की जाने वाली भाषाएं) मिलती हैं, क्योंकि आप उन्हें एक विधि हस्ताक्षर में घोषित कर सकते हैं।उदाहरण के लिए, एक विधि हस्ताक्षर हो सकता है,

public void (Enum.Choice, mychoice) 

के बजाय

public void (String, mychoice) 

दूसरे मामले में, उपयोगकर्ताओं को बार हुआ है कि mychoice"foo" या "bar", लेकिन क्या हुआ अगर होना चाहिए से आगे पता करने के लिए हो सकता है वे "baz" में गुजरते हैं, जो अमान्य है। Enum का उपयोग करके यह सुनिश्चित होगा कि अमान्य इनपुट विधि को पास नहीं किया जा सकता है, क्योंकि Enum.Choice में केवल foo और bar फ़ील्ड होंगे। यदि आपने कोशिश की तो आप baz विकल्प नहीं बना सका।

क्षमा करें, मैं जावा में भटक गया। क्या यह विषय भी सहायक होने के लिए है?

1

जो समस्या आप देखते हैं वह इसलिए है क्योंकि आपका ORM आपके एनम ऑब्जेक्ट में डेटाबेस मान मैप नहीं कर रहा है। यदि ऐसा होता है, तो आपको .value से निपटना नहीं होगा।

if Status(value) is Status.active: के बाद से निर्माता दिए गए तर्क से एक Enum बनाता है:

एक वैकल्पिक की तरह कुछ होगा।

+0

अच्छी पकड़ @EthanFurman, मैंने इसे अपने फोन से टाइप किया और मैला था। मैंने '= 0 '' ' –

+0

आह के लिए आदान-प्रदान किया है, जो पूंजी' if' बताता है। ;) –

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