根据传入参数类型的不同而调用不同的函数逻辑体,这种实现我们称之为泛型。在 Python 中叫做 singledispatch
引入包
不带装饰器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| @functools.singledispatch def myfunc(arg): print('default myfunc({!r})'.format(arg))
@myfunc.register(int) def myfunc_int(arg): print('myfunc_int({})'.format(arg))
@myfunc.register(list) def myfunc_list(arg): print('myfunc_list()') for item in arg: print(' {}'.format(item))
myfunc('string argument') myfunc(1) myfunc(2.3) myfunc(['a', 'b', 'c'])
|
带类型检测装饰器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| def check_type(func): def wrapper(*args): arg1, arg2 = args[:2] if type(arg1) != type(arg2): return '[Error] : Parameter type is different, cannot be spliced!!' return func(*args) return wrapper
@functools.singledispatch @check_type def add(obj, new_obj): raise TypeError
@add.register(str) @check_type def _(obj, new_obj): obj += new_obj return obj
print(add('hello',', world'))
print(add([1,2,3], '4,5,6'))
|