fork download
  1. from dataclasses import dataclass
  2. from inspect import signature
  3.  
  4. def default_self(method):
  5. def wrapper(self, *args, **kwargs):
  6. bound = sig.bind(self, *args, **kwargs)
  7. bound.apply_defaults()
  8. for name in names:
  9. if bound.arguments[name] is DEFAULT:
  10. bound.arguments[name] = getattr(self, name)
  11. return method(*bound.args, **bound.kwargs)
  12.  
  13. sig = signature(method)
  14. names = [name for name, param in sig.parameters.items() if param.default is DEFAULT]
  15. return wrapper
  16.  
  17. DEFAULT = object()
  18.  
  19. @dataclass
  20. class PlusCalculator:
  21. x: int = 1
  22. y: int = 2
  23. result: int = None
  24.  
  25. @default_self
  26. def plus(self, x=DEFAULT, y=DEFAULT):
  27. self.result = x + y
  28. return self.result
  29.  
  30. pc = PlusCalculator()
  31. print(pc.plus())
  32. print(pc.plus(4, 5))
  33. print(pc.plus(y=3))
  34. print(pc.plus(x=2, y=3))
Success #stdin #stdout 0.04s 10872KB
stdin
Standard input is empty
stdout
3
9
4
5