@method
def add(a):return a
@method
def add(a,b:int): return a+b
@method
def add(a,b:str):return f"{a}{b}"
@method
def add(a,b,c):return a+b+c
print(add(1,2,3))
print(add(1,2))
print(add(1,"abc"))
print(add(1))
from functools import wrapsmap = {}
def method(func): @wraps(func) def wrapper(*args, **kwargs): nonlocal func hash = (func.__code__.co_argcount, str(func.__annotations__)) if hash not in map: map[hash] = func else: func = map[hash]
print(map) func(*args, **kwargs) return wrapper
@methoddef add(a, b: int): return a+b
@methoddef add(a: int): return a
print(add(1))print(add(1, 2))
{(1, "{'a': <class 'int'>}"): <function add at 0x000001F505702EA0>}None{(1, "{'a': <class 'int'>}"): <function add at 0x000001F505702EA0>}Traceback (most recent call last): File ".\test.py", line 27, in <module> print(add(1, 2)) File ".\test.py", line 15, in wrapper func(*args, **kwargs)TypeError: add() takes 1 positional argument but 2 were given
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com。
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/python-cn/83453fc0-b8de-4e3c-a582-7e88b9b1e5ce%40googlegroups.com。
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/python-cn/CAEpnSUmzaLTQ8jCvxnJ6Q4yxs7iKkUaosOqoLM0rd90mSAKssA%40mail.gmail.com。
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/python-cn/CAATL4yzHcvFT%2BvCcgS7Px93MVMKisF%2Bn8vaD%2BxVYKredcTnCjw%40mail.gmail.com。
import inspectfrom functools import wraps
mapping = {} # sig: func
def sig_match(sig, args, kwargs): try: sig.bind(*args, **kwargs) except TypeError: return False return True
def method(func): sig = inspect.signature(func) mapping[sig] = func
@wraps(func) def wrapper(*args, **kwargs): real_func = None for sig in mapping: if sig_match(sig, args, kwargs): real_func = mapping[sig] break else: raise RuntimeError('no such func') return real_func(*args, **kwargs) return wrapper
@methoddef add(a, b: int): return a+b
@methoddef add(a: int): return a
print(add(1))print(add(1, 2))
print(add(1, 2, 3))
###### tests
/tmp > python3 t.py13Traceback (most recent call last): File "t.py", line 44, in <module> print(add(1, 2, 3)) File "t.py", line 28, in wrapper raise RuntimeError('no such func')RuntimeError: no such func