अजगर में इंटम को कैसे कन्वर्ट करें?


99

अजगर 2.7.6 के साथ नई Enum सुविधा ( बैकपोर्ट enum34 के माध्यम से ) का उपयोग करना ।

निम्नलिखित परिभाषा को देखते हुए, मैं एक इंट को संबंधित Enum मान में कैसे बदल सकता हूं?

from enum import Enum

class Fruit(Enum):
    Apple = 4
    Orange = 5
    Pear = 6

मुझे पता है कि मैं रूपांतरण करने के लिए अगर-कथनों की एक श्रृंखला को सौंप सकता हूं, लेकिन क्या रूपांतरण करने का एक आसान तरीका है? असल में, मैं एक फ़ंक्शन ConvertIntToFruit (int) को पसंद करता हूं जो एक एनम मान देता है।

मेरा उपयोग मामला है मेरे पास अभिलेखों की एक सीएसवी फ़ाइल है जहां मैं प्रत्येक रिकॉर्ड को एक ऑब्जेक्ट में पढ़ रहा हूं। फ़ाइल फ़ील्ड्स में से एक पूर्णांक फ़ील्ड है जो एक एन्यूमरेशन का प्रतिनिधित्व करता है। जैसा कि मैं ऑब्जेक्ट को पॉप्युलेट कर रहा हूं, मैं उस पूर्णांक फ़ील्ड को ऑब्जेक्ट में संबंधित Enum मान में फ़ाइल से परिवर्तित करना चाहता हूं।

जवाबों:


168

आप Enumकक्षा को 'कॉल' करते हैं :

Fruit(5)

बारी करने के लिए 5में Fruit.Orange:

>>> from enum import Enum
>>> class Fruit(Enum):
...     Apple = 4
...     Orange = 5
...     Pear = 6
... 
>>> Fruit(5)
<Fruit.Orange: 5>

से गणन सदस्यों और उनकी विशेषताओं पर प्रोग्रामेटिक एक्सेस प्रलेखन की धारा:

कभी-कभी प्रोग्राम में सदस्यों तक पहुंचने के लिए यह उपयोगी है (यानी ऐसी परिस्थितियां जो Color.redऐसा नहीं करेंगी क्योंकि सटीक रंग प्रोग्राम-राइटिंग में नहीं जाना जाता है)। Enumइस तरह की पहुंच की अनुमति देता है:

>>> Color(1)
<Color.red: 1>
>>> Color(3)
<Color.blue: 3>

संबंधित नोट में: एक स्ट्रिंग मान को मैप करने के लिए, जिसमें एनम सदस्य का नाम है, सदस्यता का उपयोग करें:

>>> s = 'Apple'
>>> Fruit[s]
<Fruit.Apple: 4>

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

बहुत अच्छा, इसलिए रूपांतरण मूल्य से है। क्या नाम सूची के माध्यम से फ़िल्टर करने के लिए सूची बोध के माध्यम से नाम के अलावा अन्य नाम के अनुरूप है और नाम विशेषताओं पर मैच लेते हैं?
jxramos

4
@jxramos मेरे उत्तर में प्रलेखन लिंक का पालन करते हैं, यह स्पष्ट रूप से वहां कवर किया गया है। आइटम का उपयोग का उपयोग करें: Fruit['Orange']
मार्टिन पीटर्स

बिंगो, बहुत बढ़िया! मैं के लिए पेज की खोज convert, coerceऔर castलेकिन कुछ भी हिट नहीं किया। लगता है जैसे जादू था access enum members by name, use item access। परफेक्टो, बहुत बहुत धन्यवाद, इस सिंटैक्स के साथ मेरे कोड को साफ करने के लिए जा रहा हूं।
jxramos

यहां तक ​​कि कूलर यह है कि मैं "foobar" in Fruit.__members__सदस्यता के लिए परीक्षण करने के लिए सामान का उपयोग कर सकता हूं और यहां तक Fruit.get( 'foobar', Fruit.Orange )कि डिफ़ॉल्ट Enum स्वाद प्राप्त करने के लिए भी खींच सकता हूं । मेरा कोड एक बहुत अधिक सरलीकृत लग रहा है जो इन सभी गौण लुकिंग मचान को हटा रहा है जो मैंने पहले रखी थी।
jxramos

1

मुझे लगता है कि यह सरल शब्दों में है कन्वर्ट करने के लिए है intमें मूल्य Enumको फोन करके EnumType(int_value), उस एक्सेस के बाद nameकी Enumवस्तु:

my_fruit_from_int = Fruit(5) #convert to int
fruit_name = my_fruit_from_int.name #get the name
print(fruit_name) #Orange will be printed here

या एक समारोह के रूप में:

def convert_int_to_fruit(int_value):
    try:
        my_fruit_from_int = Fruit(int_value)
        return my_fruit_from_int.name
    except:
        return None

-1

मुझे कुछ ऐसा ही चाहिए था ताकि मैं एक संदर्भ से मूल्य जोड़ी के किसी भी हिस्से तक पहुंच सकूं। वेनिला संस्करण:

#!/usr/bin/env python3


from enum import IntEnum


class EnumDemo(IntEnum):
    ENUM_ZERO       = 0
    ENUM_ONE        = 1
    ENUM_TWO        = 2
    ENUM_THREE      = 3
    ENUM_INVALID    = 4


#endclass.


print('Passes')
print('1) %d'%(EnumDemo['ENUM_TWO']))
print('2) %s'%(EnumDemo['ENUM_TWO']))
print('3) %s'%(EnumDemo.ENUM_TWO.name))
print('4) %d'%(EnumDemo.ENUM_TWO))
print()


print('Fails')
print('1) %d'%(EnumDemo.ENUM_TWOa))

असफलता एक अपवाद फेंकता है जैसा कि अपेक्षित होगा।

अधिक मजबूत संस्करण:

#!/usr/bin/env python3


class EnumDemo():


    enumeration =   (
                        'ENUM_ZERO',    # 0.
                        'ENUM_ONE',     # 1.
                        'ENUM_TWO',     # 2.
                        'ENUM_THREE',   # 3.
                        'ENUM_INVALID'  # 4.
                    )


    def name(self, val):
        try:

            name = self.enumeration[val]
        except IndexError:

            # Always return last tuple.
            name = self.enumeration[len(self.enumeration) - 1]

        return name


    def number(self, val):
        try:

            index = self.enumeration.index(val)
        except (TypeError, ValueError):

            # Always return last tuple.
            index = (len(self.enumeration) - 1)

        return index


#endclass.


print('Passes')
print('1) %d'%(EnumDemo().number('ENUM_TWO')))
print('2) %s'%(EnumDemo().number('ENUM_TWO')))
print('3) %s'%(EnumDemo().name(1)))
print('4) %s'%(EnumDemo().enumeration[1]))
print()
print('Fails')
print('1) %d'%(EnumDemo().number('ENUM_THREEa')))
print('2) %s'%(EnumDemo().number('ENUM_THREEa')))
print('3) %s'%(EnumDemo().name(11)))
print('4) %s'%(EnumDemo().enumeration[-1]))

जब सही ढंग से उपयोग नहीं किया जाता है तो यह एक अपवाद बनाने से बचता है और इसके बजाय, एक गलती संकेत वापस करता है। ऐसा करने का एक अधिक पायथोनिक तरीका "कोई नहीं" को वापस करना होगा, लेकिन मेरा विशेष अनुप्रयोग सीधे पाठ का उपयोग करता है।


एक Enum उदाहरण पर सिर्फ __int__और सिर्फ __str__तरीकों को क्यों नहीं परिभाषित करें ?
टिम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.