2015-01-08 11 views
8

मैंने देखा कि आजकल कई पुस्तकालय पैरामीटर के लिए एनम-प्रकार चर पर तारों के उपयोग को प्राथमिकता देते हैं।फ़ंक्शन में पैरामीटर के रूप में एनम बनाम स्ट्रिंग

जहां लोग पहले enums का उपयोग करेंगे, उदा। शुक्रवार के लिए dateutil.rrule.FR, ऐसा लगता है कि यह स्ट्रिंग का उपयोग करने के लिए स्थानांतरित हो गया है (उदा। 'एफआरआई')।

numpy (या उस बात के लिए पांडा) में एक ही है, जहां उदाहरण के लिए searchsorted तार के उपयोग करता है (जैसे पक्ष = 'छोड़', या पक्ष = 'सही') के बजाय एक परिभाषित enum से। संदेह से बचने के लिए, अजगर 3.4 से पहले यह आसानी से इस तरह के रूप में एक enum के रूप में लागू किया जा सकता था:

class SIDE: 
    RIGHT = 0 
    LEFT = 1 

और enums प्रकार चर के फायदे स्पष्ट हैं: आपको एक त्रुटि को ऊपर उठाने के बिना उन्हें गलत लिखा नहीं कर सकते, वे आईडीई आदि के लिए उचित समर्थन प्रदान करते हैं।

तो एनम प्रकारों पर चिपकने के बजाय स्ट्रिंग का उपयोग क्यों करें? क्या यह प्रोग्राम को उपयोगकर्ता त्रुटियों के लिए अधिक प्रवण नहीं करता है? यह enums बनाने के समान नहीं है - अगर कुछ भी उन्हें थोड़ा अधिक कुशल होना चाहिए। तो इस प्रतिमान शिफ्ट कब और क्यों हुआ?

उत्तर

2

आईएमएचओ यह स्वाद का विषय है। इस शैली की तरह कुछ लोग:

def searchsorted(a, v, side='left', sorter=None): 
    ... 
    assert side in ('left', 'right'), "Invalid side '{}'".format(side) 
    ... 

numpy.searchsorted(a, v, side='right') 

हाँ, यदि आप searchsortedside='foo' के साथ कॉल आप एक AssertionError तरह से बाद में कार्यावधि में मिल सकता है - लेकिन कम से कम बग ट्रैस बैक देख पहचानना बहुत आसान हो जाएगा।

अन्य लोगों को पसंद कर सकते हैं जबकि (लाभ के लिए आप पर प्रकाश डाला):

numpy.searchsorted(a, v, side=numpy.CONSTANTS.SIDE.RIGHT) 

मैं पहली बार के पक्ष में है क्योंकि मुझे लगता है कि शायद ही कभी इस्तेमाल किया स्थिरांक नाम स्थान cruft के लायक नहीं हैं। आप असहमत हो सकते हैं, और अन्य चिंताओं के कारण लोग दोनों तरफ से संरेखित हो सकते हैं।

आप सच में ध्यान करते हैं, तो कुछ भी नहीं अपने खुद के "enums" को परिभाषित करने से रोकता है:

class SIDE(object): 
    RIGHT = 'right' 
    LEFT = 'left' 

numpy.searchsorted(a, v, side=SIDE.RIGHT) 

मुझे लगता है कि इसके लायक नहीं है, लेकिन फिर से यह स्वाद की बात है।

[अद्यतन]

स्टीफन एक निष्पक्ष मुद्दा बनाया:

जैसे ही जरूरत इस तरह के एक enum का मान बदलने के लिए, देख और कई जगहों पर एक स्ट्रिंग की जगह उठता है के रूप में नहीं है मेरी :-)

मज़ा के विचार मैं देख सकते हैं कि दर्दनाक इस नाम वाले पैरामीटर के बिना एक भाषा में किया जा सकता है - उदाहरण के आप स्ट्रिंग 'right' के लिए खोज और झूठे सकारात्मक का एक बहुत प्राप्त करने के लिए इस्तेमाल करते हैं। पायथन में आप इसे side='right' के लिए खोज कर संकुचित कर सकते हैं।

बेशक यदि आप ऐसे इंटरफ़ेस से निपट रहे हैं जिसमें पहले से ही एनम्स/स्थिरांक (बाहरी सी लाइब्रेरी की तरह) का परिभाषित सेट है तो हां, हर तरह से मौजूदा सम्मेलनों की नकल करें।

3

मुझे लगता है कि कई डेवलपर्स वाले बड़े सिस्टम के लिए enums सुरक्षित हैं।

जैसे ही जरूरत इस तरह के एक enum का मान बदलने के लिए, देख और कई जगहों पर एक स्ट्रिंग की जगह :-)

सबसे महत्वपूर्ण मानदंड IMHO मज़ा के लिए मेरा विचार नहीं है उठता है के रूप में उपयोग होता है: एक मॉड्यूल या यहां तक ​​कि एक पैकेज में उपयोग के लिए एक स्ट्रिंग ठीक लगती है, एक सार्वजनिक एपीआई में मैं enums पसंद करते हैं।

1

मैं डिबगिंग के कारण स्ट्रिंग पसंद करता हूं।

side='BUY', opt_type='PUT', order_type='FILL_OR_KILL' 

को

side=1, opt_type=0, order_type=6 

की तरह एक वस्तु की तुलना मैं भी "enums" जहां मूल्यों तार कर रहे हैं की तरह है:

class Side(object): 
    BUY = 'BUY' 
    SELL = 'SELL' 
    SHORT = 'SHORT' 
1

कड़ाई से अजगर बोल enums नहीं है - कम से कम यह या v3.4

https://docs.python.org/3/library/enum.html

से पहले नहीं था

मैं प्रोग्रामर परिभाषित स्थिरांक के रूप में आपके उदाहरण के बारे में सोचना पसंद करता हूं।

argparse में, स्थिरांक के एक सेट में स्ट्रिंग मान होते हैं। जबकि कोड निरंतर नामों का उपयोग करता है, उपयोगकर्ता अक्सर स्ट्रिंग का उपयोग करते हैं।

e.g. argparse.ZERO_OR_MORE = '*' 
arg.parse.OPTIONAL = '?' 

numpy पुराने 3 पार्टी संकुल में से एक है (numeric की तरह कम से कम अपनी जड़ें हैं)। स्ट्रिंग मान enums से अधिक आम हैं। असल में मैं हाथ से किसी भी enums के बारे में सोच नहीं सकता (जैसा कि आप उन्हें परिभाषित करते हैं)।

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