非常粗略。它接受kw args并检查args的数量是否正确
def __call__(self, cls):
def init(cls_self, *args, **kw):
if len(args)+len(kw) != len(self.params):
raise RuntimeError("Wrong number of arguments")
for param, value in zip(self.params, args):
setattr(cls_self, param, value)
vars(cls_self).update(kw)
cls.__init__ = init
return cls
这个版本有一些改进
def __call__(self, cls):
def init(cls_self, *args, **kw):
for param, value in zip(self.params, args):
if param in kw:
raise TypeError("Multiple values for %s"%param)
kw[param]=value
if len(args) > len(self.params) or set(kw) != set(self.params):
raise TypeError("Wrong number of arguments")
vars(cls_self).update(kw)
cls.__init__ = init
return cls
此版本还告诉您意外的关键字参数
def __call__(self, cls):
def init(cls_self, *args, **kw):
for param, value in zip(self.params, args):
if param in kw:
raise TypeError("Multiple values for %s"%param)
kw[param]=value
unexpected_args = list(set(kw)-set(self.params))
if unexpected_args:
raise TypeError("Unexpected args %s"%unexpected_args)
missing_args = list(set(self.params)-set(kw))
if missing_args:
raise TypeError("Expected args %s"%missing_args)
vars(cls_self).update(kw)
cls.__init__ = init
return cls