蜂鳥の一滴《余録》キーワード引数の活用

蜂鳥の一滴:Jun for Python への道記事一覧
《余録》キーワード引数の活用

《著》小粒ちゃん、滴《監修》小泉ひよ子とタマゴ倶楽部
♪2009/04/20

■ 概要

キーワード引数を活用すると、密に関連するメソッド群を集約して…

■ 関連記事

何が問題か:密に関連するメソッド群

Smalltalk 版には、密に関連するプロトコル(メソッド群)をよく見掛けます。これらは、省略時の値を積極的に活用したいときに便利です。たとえば、openVisual: では、label: を省略すると、クラスの名前(anObject class name を指定したのと同じ)が設定されます。

Python では、キーワード引数を利用するとともに、省略時の値を設定することで、同等の機能を実現できます。すると、関連するメソッド群をひとつに集約できます。

from Jun.Goodies.Display.JunDisplayModel import *
## ----------------------------------------
class JunDisplayModel(PyoObject):

    ## ---------------------------------------- instance creation
    @classmethod
    def openVisual(self, anObject, label=None):
        """
openVisual: anObject  
	^self openVisual: anObject label: anObject class name

openVisual: anObject label: aString 
	| displayModel |
	displayModel := self visual: anObject.
	displayModel open.
	aString notNil ifTrue: [displayModel getWindow label: aString].
	^displayModel
        """
        def label_(label):
            if not label:
                label = anObject.__class__.__name__
            return label
        #
        aString = label_(label)
        ## ----------------------------------------
        displayModel = self.class_visual(anObject)
        displayModel.open()
        if aString: displayModel._getWindow_label(aString)        # @todo: provisional         
        return displayModel

局所関数 label_ では、キーワード引数 label を省略したときの値を設定します。

aModel.openVisual(anObject)
aModel.openVisual(anObject, "-- non label ---")
aModel.openVisual(anObject, label="-- non label ---")
aModel.openVisual(anObject, label=anObject.__class__.__name__)

すると、このような多様なメソッド呼び出しに呼応できます。ここでは、最初と最後の例は、同じ結果になります。