fork download
  1. from dataclasses import dataclass
  2. from inspect import signature, Parameter
  3.  
  4. def lax_dataclass(cls_or_None=None, **kwargs):
  5. def decorator(cls):
  6. def __init__(self, *args, **kwargs):
  7. orig_init(self, *args, **{
  8. name: value for name, value in kwargs.items() if name in accepted_keywords
  9. })
  10. cls = dataclass(**kwargs)(cls)
  11. orig_init = cls.__init__
  12. accepted_keywords = {
  13. param.name for param in signature(orig_init).parameters.values()
  14. if param.kind in (Parameter.POSITIONAL_OR_KEYWORD, Parameter.KEYWORD_ONLY)
  15. }
  16. cls.__init__ = __init__
  17. return cls
  18. if cls_or_None is None:
  19. return decorator
  20. return decorator(cls_or_None)
  21.  
  22. @lax_dataclass
  23. class MyClass:
  24. a: int
  25.  
  26. print(MyClass(20, **{"kwarg1" : 1}))
Success #stdin #stdout 0.26s 19320KB
stdin
Standard input is empty
stdout
MyClass(a=20)