2012-10-10 18 views
10

पायथन में enums को कार्यान्वित करने के तरीके पर कुछ प्रश्न हैं। अधिकांश समाधान अंत कुछ इस तरह के कम या ज्यादा बराबर किया जा रहा है:पायदान के बिना पाइथोनिक डिज़ाइन

class Animal: 
    DOG=1 
    CAT=2 

दूसरों के निर्माण enums के और अधिक जटिल तरीके सुझाने है, लेकिन ultimatly इस उदाहरण की तरह देखने के लिए जब सभी ने कहा और किया जाता है होते हैं।

जावा और सी # में अपने अनुभव के आधार पर, मैं इस तरह के मुहावरे के लिए सभी प्रकार के उपयोगों के बारे में सोच सकता हूं। हालांकि, यह बहुत पाइथनिक प्रतीत नहीं होता है। वास्तव में, ऐसा लगता है कि हर बार जब कोई पूछता है कि पाइथन में क्यों नहीं हैं, तो आपको कैंडन प्रतिक्रियाओं के साथ थोड़ा सा झटका लगता है कि पाइथन जैसी भाषा में संकलन समय प्रकार की सुरक्षा को कैसे लागू करने और लागू करने का कोई कारण नहीं है, या पाइथन में कितने डिज़ाइनों को एम्स की आवश्यकता होती है, वे खराब गंध हैं।

मेरा सवाल यह नहीं है कि पाइथन में enums को कैसे कार्यान्वित किया जाए, लेकिन आम लोगों में कैसे समस्याएं हल हो जाती हैं जो पाइथोनिक तरीके से enums को उधार देती हैं। दूसरे शब्दों में, आप एक समस्या को कैसे हल करेंगे जो आपके जावा/सी # समाधान को पाइथन पर पोर्ट किए बिना संभावित मूल्यों के एक अलग सेट के साथ डेटा प्रकार रखने के लिए खुद को उधार देता है।

+2

मुझे नहीं पता कि आपने जो उदाहरण दिया है वह गैर-पायथनिक है। और अगर मैं एक राज्य मशीन लागू कर रहा था तो मैं वस्तुओं के कार्यों का लाभ उठाता हूं और अपने राज्यों को कार्यों के रूप में परिभाषित करता हूं। –

+0

मुझे नहीं पता कि एनम लागू करने के तरीके के बारे में विशेष रूप से कुछ भी गलत है, लेकिन मुझे यह महसूस हो रहा है कि पाइथन समुदाय के कुछ लोग उन समाधानों पर विचार करते हैं जिनके लिए पहले स्थान पर अन-पायथनिक होने की आवश्यकता होती है। आपका सुझाव है कि राज्य के रूप में प्रथम श्रेणी के कार्यों का उपयोग करके एक राज्य मशीन लागू की जानी चाहिए, हालांकि उत्तर के लिए एक अच्छी शुरुआत है! – jlund3

उत्तर

4

PEP 435 अभी स्वीकार किया गया था, जो एनम क्लास और इंटिनम जैसे अन्य डेरिवेटिव के साथ मानक पुस्तकालय में enum पैकेज जोड़ता है। इसका मतलब है कि पायथन 3.4 से शुरू होने पर, डिजाइन में enums का उपयोग करने के लिए "पायथनिक" तरीका इस पैकेज के साथ है।यह कुछ इस तरह दिखेगा:

>>> from enum import Enum 
>>> class Color(Enum): 
... red = 1 
... green = 2 
... blue = 3 

>>> print(Color.red) 
Color.red 

>>> print(Color.red.name) 
red 

>>>> for color in Color: 
....  print(color) 
Color.red 
Color.green 
Color.blue 

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

+0

केवल दोष है: पाइथन 3.4 से पहले काम नहीं करता है, जो अब तक (अक्टूबर 2013) कोई बड़ा अंतर नहीं है। तो चलो चाय पीते हैं और पीते हैं। – nerdoc

+1

पायथन 2.4+ के लिए पीईपी 435 का बैकपोर्ट पीईपीआई पर उपलब्ध है [enum34] (https://pypi.python.org/pypi/enum34/)। हालांकि यह अनौपचारिक है, यह पीईपी 435 सह लेखक एथन फर्मन द्वारा लिखित है। – tawmas

1

सी # या जावा पृष्ठभूमि से नहीं आना मैं अभी भी enums में इस रुचि को समझ नहीं पा रहा हूं।

जो मैं समझता हूं, उससे शायद मैं सेटिंग्स फ़ाइल में किसी भी आवश्यक स्थिरांक डालकर और जहां आवश्यक हो वहां आयात करके डीजेंगो शैली में वापस आऊंगा।

settings.py/animals.py

DOG = 1 
CAT = 2 

अन्य फ़ाइल:

from animals import CAT, DOG 

या यहाँ तक कि ...

settings.py

ANIMALS = { "DOG": 1, "CAT": 2} 

अन्य फ़ाइल:

from settings import ANIMALS 

my_animal = "FROG" 
if my_animal not in ANIMALS.keys(): 
    print "new species discovered!" 
+2

'अगर my_animal ANIMALS.keys() में नहीं है: 'वास्तव में (ए) लंबा है और (बी) सरल जांच की तुलना में कम कुशल है, यदि my_animal anIMALS में नहीं है। – Amber

+2

मुझे लगता है कि यह उदाहरण हाइलाइट करता है कि क्यों जावा/सी # के संपर्क वाले लोग पाइथन में enums चाहते हैं। बतख टाइपिंग को स्वीकार करना एक बात है जहां कुछ भी जानता है कि कैसे quack को स्वीकार किया जाता है। यह एक पूरी तरह से अलग बात है (जावा/सी # लड़के के लिए) यह कहने के लिए कि आपकी भाषा आपको सरल टाइप करने की अनुमति देती है। उदाहरण के लिए, मान लीजिए कि मैंने my_animal = "DOG" के बजाय my_animal = "dog" टाइप किया है और किसी भी तरह से एक नई प्रजाति की खोज की है? एक enum होने के नाते जहां आप सिर्फ my_animal = Animal.DOG आपको थोड़ा दर्द बचा सकता है क्योंकि आपको एक खोजी गई प्रजाति बग की बजाय रन टाइम पर आपके चेहरे में एक विशेषता त्रुटि मिल जाएगी। – jlund3

+0

सच है, मैं बस स्पष्ट रूप से दिखाना चाहता हूं कि क्या किया जा रहा है, क्योंकि नए comers मुझे स्पष्ट नहीं है कि विकल्प में क्या किया जा रहा है। – monkut

3

अजगर तार के बाद से अडिग हैं (और के रूप में यह आवश्यक देखता अजगर उन्हें इंटर्न), वहाँ वास्तव में चीजों के सेट के लिए सांख्यिक enums का उपयोग कर के लिए एक विशिष्ट लाभ नहीं है। इसके बजाए, आप स्ट्रिंग्स के frozenset या tuple का उपयोग कर सकते हैं (इस पर निर्भर करता है कि आप ऑर्डर करने की परवाह करते हैं या नहीं)।

यदि दूसरी तरफ, आप किस चीज की परवाह करते हैं, तो नाम की स्थिति है, जिससे वर्ग की चीजें गुणों को ठीक काम करता है।

टिप्पणियों में उल्लिखित अनुसार, यदि आप राज्य मशीन कार्यान्वयन की तरह कुछ ढूंढ रहे हैं, तो प्रथम श्रेणी के कार्य आपके मित्र हैं।

+0

.. और यदि आप नामस्थान के बारे में परवाह करते हैं * और * आप 3.3 का उपयोग कर रहे हैं, तो यह नुस्खा है: http://code.activestate.com/recipes/578279-using-chainmap-for-embedded-namespaces/?in=lang -पिथॉन –

+1

यदि आप 3.3 का उपयोग कर रहे हैं, तो आप केवल ['प्रकार। सिंपल नामस्थान '] (http://docs.python.org/py3k/whatsnew/3.3.html#simplenamespace) का उपयोग कर सकते हैं :) –

-1

मुझे सी # में Enums में विश्वास नहीं है। राज्य मशीन के लिए आपके पास रणनीति पैटर्न है। किसी ऑब्जेक्ट की स्थिति को देखने और निर्णय लेने के बजाय। ऑब्जेक्ट में क्या करना है इसके तर्क को समझें।

यह पायथन में एक प्राकृतिक दृष्टिकोण है और मेरे लिए enums की शुरूआत सिर्फ खराब कोड को प्रोत्साहित करती है।

+0

प्रश्न विशेष रूप से राज्य मशीनों के बारे में बात नहीं कर रहा है। मैं मानता हूं कि दोनों सी # और पायथन एनम्स में एक राज्य मशीन को लागू करने का तरीका नहीं है। हालांकि, हम इसके बजाय एक प्रकार का प्रतिनिधित्व करने के बारे में बात कर रहे हैं जिसमें नामित मूल्यों का एक छोटा सा सेट है। उन समस्याओं के लिए जिनमें डेटा प्रकार के प्रकार शामिल हैं, enums काफी उपयोगी हैं। – jlund3

+0

मेरे लिए जो विरासत की तरह लगता है। एक प्रकार जिसका नाम नामों का एक छोटा सा सेट है। दोबारा, पाइथन ने पहली बार इसे enums सहित नहीं मिला। –

+0

समान पेरेंट क्लास के साथ कई डेटाटाइप बनाने के लिए विरासत का उपयोग करना वही बात नहीं है जैसा संभावित डेटा के एक छोटे से सेट के साथ एक डेटाटाइप है ... – jlund3

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