Python-এ একটি এনাম হলো ইউনিক নামের একটি সেট, যেখানে প্রতিটি নাম একটি ইউনিক ও কনস্ট্যান্ট মানের সাথে বাঁধা থাকে।
Enums ডিফাইন করা হয় একটি Enum ক্লাস ইনহেরিট করে।
বিল্ট-ইন এনাম টাইপগুলো enum মডিউলে পাওয়া যায় এবং from enum import Enum দিয়ে Enum ক্লাসটি ইমপোর্ট করা যায়।
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
খেয়াল করুন, enum মেম্বারগুলোর মান যেকোনো ডেটা টাইপ হতে পারে, যেমন str, tuple, float ইত্যাদি।
class Color(Enum):
RED = 'red'
GREEN = 'green'
ফাংশন-কল সিনট্যাক্স ব্যবহার করেও Enums তৈরি করা যায়।
from enum import Enum
Animal = Enum('Animal', 'ANT BEE CAT DOG')
list(Animal)
#=> [<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]
Animal.ANT.value
#=> 1
একটি enum-এর দুটি মেম্বারকে একই মান অ্যাসাইন করলে, পরে অ্যাসাইন করা মেম্বারটি আগেরটির একটি অ্যালিয়াস হয়ে যায়। একটি enum-এর দুটি ভিন্ন মেম্বারের জন্য একই নাম ব্যবহার করা যায় না।
class Color(Enum):
RED = 1
GREEN = 2
ALIAS_OF_RED = 1
Color.ALIAS_OF_RED
#=> <Color.RED: 1>
এনামের মেম্বারগুলোর মধ্যে দিয়ে ইটারেশন করা যায় সাধারণ for member in সিনট্যাক্স দিয়ে:
for member in Color:
print((member.name, member.value))
#=> (RED, 1)
#=> (GREEN, 2)
# __members__.items() helps you to loop through alias as well
for member in Color.__members__.items():
print(member)
#=> ('RED', <Color.RED: 1>)
#=> ('GREEN', <Color.GREEN: 2>)
#=> ('ALIAS_OF_RED', <Color.RED: 1>)
Enum মেম্বারগুলো is (আইডেন্টিটি অপারেটর) বা is not দিয়ে তুলনা করা যায়। == বা != (ইকুয়ালিটি অপারেটর)ও একইভাবে কাজ করে:
a = Color.RED
a is Color.RED
#=> True
a == Color.RED
#=> True
ইন্টিজার মান অ্যাসাইন করার জন্য auto() ফাংশনটি 1 দিয়ে শুরু করে এবং পরের মানগুলো স্বয়ংক্রিয়ভাবে সেট করে।
class Shape(Enum):
CIRCLE = auto()
SQUARE = auto()
OVAL = auto()
অ্যালিয়াসিং বন্ধ করতে (ভিন্ন নামে ডুপ্লিকেট মান প্রতিরোধ করতে), ক্লাস ডেকোরেটর @enum.unique ডেকোরেটরটি ব্যবহার করা যেতে পারে।
@enum.unique
class Shape(Enum):
CIRCLE = 1
SQUARE = 2
TRIANGLE = 1
#=> ValueError: duplicate values found in <enum 'Shape'>: TRIANGLE -> CIRCLE
কোনো নির্দিষ্ট মানের জন্য enum মেম্বার পেতে এই নোটেশনটি ব্যবহার করা যায়: <EnumName>(<value>)।
g = Color(2)
g is Color.GREEN
#=> True
g
#=> <Color.GREEN: 2>
যেকোনো মিক্স-ইন বা ডেটা টাইপ দিয়ে Enum ক্লাস সাবক্লাস করে একটি কাস্টম রেস্ট্রিক্টেড Enum লেখা যায়।
যেমন:
class StrEnum(str, Enum):
pass
Enum সাবক্লাস করা কেবল তখনই অনুমোদিত, যখন enum কোনো মেম্বার ডিফাইন করে না।
আরও বিস্তারিত ও ব্যাখ্যার জন্য enum হাউ-টু এবং enum কুকবুক দেখুন।