python: บันทึกเรื่อง default argument

default agrument มีประโยชน์ในการกำหนดค่าปริยายให้กับตัวแปรที่ส่งผ่านไปให้ฟังก์ชั่น
ขอยกตัวอย่างเป็นคลาสแทน

>>> class X:
...   def __init__(self, a=1, b=2):
...     self.a = a
...     self.b = b
...     print "X.a=%s, X.b=%s" % (self.a, self.b)
... 

>>> x = X()
X.a=1, X.b=2

>>> x = X(11)
X.a=11, X.b=2

>>> x = X(a=111)
X.a=111, X.b=2

>>> x = X(b=222)
X.a=1, X.b=222

ตัวแปร a และ b เป็นตัวแปรที่เป็น default argument

การสืบทอดคลาสมักนิยมใช้รูปแบบอาร์กิวเมนต์เป็น *argv **keyw
เพื่อหลีกเลี่ยงการกำหนดอาร์กิวเมนต์ใหม่
โดยไพธอนจะแทนอาร์กิวเมนต์ที่ต้องกำหนดค่าให้ด้วยตัวแปร argv เป็นข้อมูลชนิด tuple
และแทนอาร์กิวเมนต์ที่มีค่าปริยายกำหนดไว้แล้วด้วยตัวแปร keyw เป็นข้อมูลชนิด dictionaries
เช่น

class Y(X):
  def __init__(self, *argv, **keyw):
    self.__parent = X
    self.__parent.__init__(self, *argv, **keyw)

ตัวแปรทั้งหมด จะส่งผ่านไปให้คลาส X

เราสามารถดักและเปลี่ยนแปลงค่าในอาร์กิวเมนต์ได้ ดังนี้

>>> class Y(X):
...   def __init__(self, *argv, **keyw):
...     if keyw.has_key("a") and keyw["a"] > 111: keyw["a"]=111
...     self.__parent = X
...     self.__parent.__init__(self, *argv, **keyw)
... 

>>> y = Y()
X.a=1, X.b=2

>>> y = Y(a=999999)
X.a=111, X.b=2