サンプルコード
Py2 Py3 ともに動作確認済み
ハノイの塔
すっきり!
テストは下に
# -*- coding: utf8 -*-
from __future__ import print_function
from kwmatch import KwMatchif __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):passtypecheck=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]