我正在尝试编写函数的类型控制装饰器,它也适用于类内的方法。所以我必须考虑方法中出现的 self 参数。但我不知道如何检测这种情况。
这是我的装饰器的代码:
def typedef_control(*args, **kwargs):
"""Decorator with parameters"""
def decorator(func):
"""Decorator return changed function"""
def func_changed(*args_, **kwargs_):
if(len(args) != len(args_)):
raise IOError("Nombre d'argument de la fonction différent de celui du décorateur")
for i, arg_ in enumerate(args_):
if args[i] is not type(arg_):
raise TypeError("Argument {0} n'est pas de type {1}".format(i, args[i]))
for key in kwargs_:
if key not in kwargs:
raise TypeError("Argument {0} sans type".format(repr(key)))
if kwargs[key] is not type(kwargs_[key]):
raise TypeError("Argument {0} n'est pas de type {1}".format(repr(key), kwargs[key]))
return func(*args_, **kwargs_)
return func_changed
return decorator
这里有一个例子:
class MyClass:
@typedef_control(int)
def __init__(self, param_int)
pass
正如预期的那样,它将进入第一个 if 语句 if(len(args) != len(args_))。
所以我必须在 args_[0] 上添加一个条件。我猜 self 是通过继承在新方法中创建的对象。现在我不知道该怎么办。
如果您有任何想法,我会很高兴收到您的来信。