এনাম - স্ট্রিং রূপান্তরকরণের জন্য এনামের মান পাওয়া


108

আমি নিম্নলিখিত এনাম সংজ্ঞায়িত করেছি

from enum import Enum


class D(Enum):
    x = 1
    y = 2


print(D.x)

এখন মুদ্রিত মান হয়

D.x

পরিবর্তে আমি চেয়েছিলাম এনামের মানটি মুদ্রিত হোক

1

এই কার্যকারিতা অর্জনের জন্য কী করা যায়?


1
আমার অ্যাক্সেস প্যারামিটারগুলি স্পষ্ট করা উচিত, আমি ডেক্সভ্যালু জিনিসটি জানি, আমি কী চাই মান ফিরিয়ে দিতে ডেক্স স্ট্রিং রূপান্তর, দুঃখিত যদি প্রশ্নটি শর্তটি পরিষ্কার না করে তবে।
বৈভব মিশ্র

উত্তর:


188

আপনি এনাম বস্তুটি মুদ্রণ করছেন । .valueআপনি যদি এটি মুদ্রণ করতে চান তবে অ্যাট্রিবিউটটি ব্যবহার করুন :

print(D.x.value)

গণনা সদস্য এবং তাদের বৈশিষ্ট্য বিভাগে প্রোগ্রামেটিক অ্যাক্সেস দেখুন :

আপনার যদি এনাম সদস্য থাকে এবং এর নাম বা মান প্রয়োজন হয়:

>>>
>>> member = Color.red
>>> member.name
'red'
>>> member.value
1

আপনি __str__আপনার এনমের সাথে একটি পদ্ধতি যুক্ত করতে পারেন, যদি আপনি যা চান তা যদি একটি কাস্টম স্ট্রিং প্রতিনিধিত্ব করে:

class D(Enum):
    def __str__(self):
        return str(self.value)

    x = 1
    y = 2

ডেমো:

>>> from enum import Enum
>>> class D(Enum):
...     def __str__(self):
...         return str(self.value)
...     x = 1
...     y = 2
... 
>>> D.x
<D.x: 1>
>>> print(D.x)
1

আমি যখন এটি একটি পূর্ণসংখ্যার মানের সাথে তুলনা করি তখন এটি বস্তু হিসাবে ফিরে আসে। উদা: if D.x == 10: ...। পূর্ণসংখ্যার জন্য আমার কোন পদ্ধতি অবলম্বন করা উচিত?
আল্পার

@ আল্পার: ঠিক একইভাবে; D.xএটি এনাম অবজেক্ট, D.x.valueএকটি পূর্ণসংখ্যা মান। আপনার যদি অবশ্যই এনাম মানগুলি পূর্ণসংখ্যার মতো কাজ করে থাকে তবে IntEnumটাইপটি ব্যবহার করুন , যেখানে প্রতিটি উপাদান একটি সাবক্লাস intএবং তাই IntEnumD.x == 10কাজ করবে।
Martijn Pieters

আমি যোগ করেছি def __eq__(self, other): return int(self.value) == otherএবং def __int__(self): return int(self.value)এখনও তবুও আমি মনে করি যে .valueযখন আমি তুলনা ব্যবহার করি না তখন মামলাগুলি ব্যবহার করতে হয়
আল্পার

@ আল্পার: __eq__যখন otherঅন্য এনাম মূল্য হবে তখন প্রয়োগটি কার্যকর হয় না ; D.x == D.y, যেখানে D.x.value == D.y.valueসত্য হবে, উদাহরণস্বরূপ ব্যর্থ হবে। মনে হচ্ছে আপনি ওখানে IntEnumপরিবর্তে ব্যবহার করতে চান Enum
Martijn Pieters

7

আমি নিম্নলিখিত ব্যবহার করে অ্যাক্সেস কার্যকর করেছি

class D(Enum):
    x = 1
    y = 2

    def __str__(self):
        return '%s' % self.value

এখন আমি ঠিক করতে পারি

print(D.x)1ফলাফল হিসাবে পেতে ।

আপনি পরিবর্তে self.nameমুদ্রণ করতে চান ক্ষেত্রে আপনি ব্যবহার করতে পারেন ।x1


2
স্ট্রিং ফর্ম্যাটিং এবং কেন self._value_? return str(self.value)আরও সোজা।
মার্টিজন পিটারস

1
আমি কেবল উত্সটির দিকে তাকিয়েছিলাম এবং এটি কীভাবে এটি কার্যকর করা হয়, তবে আপনি সঠিক এবং self.valueপরিষ্কার আছেন।
বৈভব মিশ্র

3
একক আন্ডারস্কোর বৈশিষ্ট্যগুলি উত্পন্ন এনাম শ্রেণীর অভ্যন্তরীণ; ডকুমেন্টেড অ্যাট্রিবিউটের সাথে আরও ভাল লেগে থাকুন (এটি একটি বিশেষ বর্ণনাকারী হিসাবে ঘটে যাতে আপনি এখনও valueআপনার এনাম টাইপের নাম হিসাবে ব্যবহার করতে পারেন )।
মার্টিজন পিটারস

@ মার্তিজনপিটাররা সম্মত হয়েছেন
বৈভব মিশ্র

0

Enumকোনও স্ট্রিং ব্যবহার করে অ্যাক্সেস করার জন্য অনুসন্ধান করার সময় আমি এই পৃষ্ঠাটি পেয়েছি । আমি জানি যে এই বিবরণী প্রশ্নে যা জিজ্ঞাসা করা হচ্ছে তা নয় তবে শিরোনামটি এটি 'প্রস্তাব দেয়'।

স্ট্রিং ব্যবহার করে এনাম পেতে আপনি নিম্নলিখিতটি করতে পারেন:

from enum import Enum


class D(Enum):
    x = 1
    y = 2


print(D["x"])  # <D.x: 1>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.