Enumeration
คุณสมบัตินี้มีใน Python เกือบจะดีใจละ แต่ว่าเริ่มมีในเวอร์ชั่น 3.4 ตาม PEP 435 ซึ่งไม่ใช่เวอร์ชั่นที่กำลังใช้อยู่ เฮ้อ....เศร้า แต่ยังไงก็ต้องเปลี่ยนไปใช้รุ่นใหม่อยู่ดี ตอนนี้ขอรอ Package หรือ Module ต่าง ๆ ที่มีสามารถทำงานได้บนรุ่น 3 เยอะ ๆ ก่อนค่อยย้ายไป แล้วถ้างั้นตอนนี้ทำยังไงดีล่ะ
ตัวอย่างการใช้งาน Enumeration ในรุ่น 3.4
from enum import Enum Animal = Enum('Animal', 'ant bee cat dog')หรือจะเขียนแบบข้างล่างนี้ก็ได้
class Animals(Enum): ant = 1 bee = 2 cat = 3 dog = 4
def enum(**enums): return type('Enum', (), enums)การใช้งาน
Numbers = enum(ONE=1, TWO=2, THREE='three') Numbers.ONE #ได้ค่าเป็น 1 Numbers.TWO # ได้ค่าเป็น 2 Numbers.THREE # ได้ค่าเป็น 'three'ถ้าจะทำเป็น Automatic Enumeration ก็จะเป็น
# ใช่ * คือส่งค่าเป็น tuples ส่วนน ** เป็นการส่งค่าแบบ dictionary def enum(*sequential, **named): enums = dict(zip(sequential, range(len(sequential))), **named) return type('Enum', (), enums)การใช้งาน
Numbers = enum('ZERO', 'ONE', 'TWO') Numbers.ZERO #ได้ค่า 0 Numbers.ONE #ได้ค่า 1การแปลงจากค่าไปเป็นชื่อก็สามารถทำได้ดังนี้
def enum(*sequential, **named): enums = dict(zip(sequential, range(len(sequential))), **named) reverse = dict((value, key) for key, value in enums.iteritems()) enums['reverse_mapping'] = reverse return type('Enum', (), enums)เหมาะกับการนำชื่อ enum นั้นออกมาแสดงผลแต่อาจเกิดข้อผิดพลาด KeyError ถ้าค่าที่ให้หาไม่ได้ถูกแมพไว้กับชือ
Numbers.reverse_mapping['three'] #ได้ชื่อ 'THREE'เมื่อลองดูแล้วก็ค่อนข้างงงกับความยืดหยุ่นของ Python อยู่เหมือนกันที่สามารถเขียนได้ทั้งรูปแบบ Functional และ Object แต่ได้ class ออกมาเหมือนกัน เอาเป็นว่าทำได้ละกัน
Constant
การประกาศค่าคงที่ก็ไม่สามาถทำได้ตรง ๆ ใน Python เช่นกัน แต่ถ้าต้องการใช้งานก็ยังสามารถประยุกต์ให้เราสามารถสร้างค่าคงที่ได้ในโปรแกรมโดยสร้างโมดูลดังนี้#สร้าง constant.py ด้วยโค้ดต่อไปนี้ class _const: class ConstError(TypeError): pass def __setattr__(self, name, value): if self.__dict__.has key(name): raise self.ConstError, "Can't rebind const(%s)"%name self.__dict__[name]=value import sys sys.modules[__name]=_const()จากโมดูลข้างต้นจะสามารถสร้างค่าคงที่ได้ดังนี้
#ในไฟล์ที่ต้องการใช้งานให้เรียกใช้โมดูลที่สร้างไว้ก่อนหน้า import const #ประกาศค่าคงที่โดยใช้คำสั่ง const.magic = 23 #ถ้ามีการประกาศค่าซ้ำโปรแกรมจะขึ้น Error (const.ConstError) โดยลองประกาศค่าซ้ำ const.magic = 88
User-Defined Data Type
เรื่องนี้ก็เช่นเดียวกับเรื่องก่อนหน้าคือ Pyhton ไม่มีให้ประกาศกันตรง ๆ ต้องใช้การเลี่ยงไปใช้ dictionary หรือใช้ class คล้ายกับข้างบน ถ้าหากใช้ dictionary ก็จะได้Person = {'firstname':None, 'lastname':None}การใช้งานทำได้โดย
Person['firstname']="firstname" Person['lastname']="lastname"ถ้าจะใช้้ class สำหรับปัญหานี้จะออกมาในรูปแบบ
class Person(object): firstname=None lastname=Noneการใช้งานจะเป็นดังนี้
Person.firstname="firstname" Person.lastname="lastname"ก็ต้องขอขอบคุณแหล่งข้อมูลต่าง ๆ ที่ยกตัวอย่างมา เป็นประโยชน์อย่างมาก สำหรับบทความนี้ก็ขอจบไว้แต่เพียงเท่านี้