サンプルコード

Py2 Py3 ともに動作確認済み

ハノイの塔

すっきり!


# -*- coding: utf8 -*-
from __future__ import print_function
from kwmatch import KwMatch

if __name__=="__main__":
hanoii_main=KwMatch()

@hanoii_main.case(n=1) #1枚のとき
def _(start,goal,rest,n):
return [ (start,goal) ]

@hanoii_main.default
def _(start,goal,rest,n): # それ以外
return ( hanoii_main(start,rest,goal,n=n-1)+
[(start,goal)]+
hanoii_main(rest,goal,start,n=n-1))
# n だけ キーワード引数で指定

テストは下に

型チェック


#型チェック
class Cbase(object):pass
class C1(Cbase):pass

typecheck=KwMatch()
@typecheck.case(x=Cbase)
def _(x):
return x
@typecheck.case(x=int)
def _(x):
return str(x)

@typecheck.default #例外の型を指定
def _(x):
raise TypeError(x)

c=Cbase()
c1=C1()
assert typecheck(x=c)==c
assert typecheck(x=c1)==c1 #サブクラスも通る
assert typecheck(x=3)=="3" #int の場合 文字に変換
try:
typecheck(x="a")=="a" #それ以外の型はエラー
raise Exception("TypeCheck Reak")
except TypeError as e:
e.args[0]=="a"

値を範囲指定

  • x=slice(a,b) で、 xは a以上 b以下
  • x=set([a,b,c])で、 xは a,b,cのいずれか

#値を範囲指定
range_test=KwMatch()
@range_test.case(n=0)
def _(n):
return [0]

@range_test.case(n=slice(1,3)) # slice(x,y) で範囲指定 x<=n<=y
def _(n):
return range_test(n=n-1)+[n-1]

@range_test.case(n=set((4,5))) # in set 集合に含まれるか
def _(n):
return range_test(n=n-1)+["abcdef"[n]]

@range_test.default #それ以外
def _(n):
return range_test(n=n-1)+[n+1]

range_test(n=7)==[0,0,1,2,"e","f",7,8]