কীভাবে পাইথনে এনামকে ইনট রূপান্তর করবেন?


96

পাইথন ২.7. with সহ নতুন এনাম বৈশিষ্ট্যটি ( ব্যাকপোর্ট এনুম 34 এর মাধ্যমে ) ব্যবহার করা হচ্ছে।

নিম্নলিখিত সংজ্ঞাটি দেওয়া, আমি কীভাবে একটি এনটকে সংশ্লিষ্ট এনুম মানের রূপান্তর করতে পারি?

from enum import Enum

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

আমি জানি আমি রূপান্তর করতে ইফ-স্টেটমেন্টগুলির একটি ধারাবাহিক হস্তান্তর করতে পারি তবে রূপান্তর করার কোনও সহজ পাইথোনিক উপায় আছে কি? মূলত, আমি একটি ফাংশন কনভার্টইন্টটোফ্রুট চাই (int) যা একটি এনাম মান দেয়।

আমার ব্যবহারের ক্ষেত্রে হ'ল আমার কাছে রেকর্ডগুলির একটি সিএসভি ফাইল রয়েছে যেখানে আমি প্রতিটি রেকর্ডকে একটি বস্তুর মধ্যে পড়ছি। ফাইল ক্ষেত্রগুলির মধ্যে একটি হল একটি পূর্ণসংখ্যা ক্ষেত্র যা একটি গণনা উপস্থাপন করে। যেহেতু আমি অবজেক্টটি পপুলেট করছি আমি সেই পূর্ণসংখ্যার ক্ষেত্রটি ফাইল থেকে বস্তুর সাথে সম্পর্কিত এনাম মান রূপান্তর করতে চাই।

উত্তর:


165

আপনি 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
@ জ্যাক্স্রামোস আমার উত্তরে ডকুমেন্টেশন লিঙ্কটি অনুসরণ করেন, এটি সেখানে স্পষ্টভাবে আবৃত covered আইটেমটি অ্যাক্সেস ব্যবহার করুন: Fruit['Orange']
মার্টিজন পিটারস

বিঙ্গো, খুব দুর্দান্ত! আমি পৃষ্ঠা অনুসন্ধান convert, coerceএবং castকিন্তু কিছু আঘাত করা হয়নি। মনে হচ্ছে যাদু ছিল access enum members by name, use item access। পারফেক্টো, আপনাকে অনেক ধন্যবাদ, এই কোডটি দিয়ে আমার কোডটি পরিষ্কার করতে চলেছে।
jxramos

এমনকি কুলারটি হ'ল আমি "foobar" in Fruit.__members__সদস্যতার জন্য পরীক্ষা করার মতো স্টাফ ব্যবহার করতে পারি এবং Fruit.get( 'foobar', Fruit.Orange )ডিফল্ট এনাম স্বাদ পেতে এমনকি টানতে পারি । আমার কোডটি আরও অনেক সরলীকৃতভাবে এই সমস্ত আনুষঙ্গিক লুপ স্ক্যাফল্ডিং অপসারণ করছে যা আমি আগে রেখেছিলাম।
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]))

সঠিকভাবে ব্যবহার না করা হলে এটি একটি ব্যতিক্রম তৈরি করা এড়িয়ে যায় এবং পরিবর্তে, একটি ত্রুটিযুক্ত ইঙ্গিতটি পাস করে। এটি করার আরও একটি পাইথোনিক উপায় হ'ল "কিছুই নয়" ফেরত পাঠানো কিন্তু আমার বিশেষ অ্যাপ্লিকেশনটি পাঠ্যটি সরাসরি ব্যবহার করে।


কেন কেবল একটি এনাম উদাহরণে __int__এবং __str__পদ্ধতিগুলি সংজ্ঞায়িত করা হচ্ছে না ?
টিম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.