from dataclasses import dataclass
from inspect import signature
def default_self(method):
def wrapper(self, *args, **kwargs):
bound = sig.bind(self, *args, **kwargs)
bound.apply_defaults()
for name in names:
if bound.arguments[name] is DEFAULT:
bound.arguments[name] = getattr(self, name)
return method(*bound.args, **bound.kwargs)
sig = signature(method)
names = [name for name, param in sig.parameters.items() if param.default is DEFAULT]
return wrapper
DEFAULT = object()
@dataclass
class PlusCalculator:
x: int = 1
y: int = 2
result: int = None
@default_self
def plus(self, x=DEFAULT, y=DEFAULT):
self.result = x + y
return self.result
pc = PlusCalculator()
print(pc.plus())
print(pc.plus(4, 5))
print(pc.plus(y=3))
print(pc.plus(x=2, y=3))
ZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmZyb20gaW5zcGVjdCBpbXBvcnQgc2lnbmF0dXJlCgpkZWYgZGVmYXVsdF9zZWxmKG1ldGhvZCk6CiAgICBkZWYgd3JhcHBlcihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGJvdW5kID0gc2lnLmJpbmQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGJvdW5kLmFwcGx5X2RlZmF1bHRzKCkKICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKICAgICAgICAgICAgaWYgYm91bmQuYXJndW1lbnRzW25hbWVdIGlzIERFRkFVTFQ6CiAgICAgICAgICAgICAgICBib3VuZC5hcmd1bWVudHNbbmFtZV0gPSBnZXRhdHRyKHNlbGYsIG5hbWUpCiAgICAgICAgcmV0dXJuIG1ldGhvZCgqYm91bmQuYXJncywgKipib3VuZC5rd2FyZ3MpCgogICAgc2lnID0gc2lnbmF0dXJlKG1ldGhvZCkKICAgIG5hbWVzID0gW25hbWUgZm9yIG5hbWUsIHBhcmFtIGluIHNpZy5wYXJhbWV0ZXJzLml0ZW1zKCkgaWYgcGFyYW0uZGVmYXVsdCBpcyBERUZBVUxUXQogICAgcmV0dXJuIHdyYXBwZXIKCkRFRkFVTFQgPSBvYmplY3QoKQoKQGRhdGFjbGFzcwpjbGFzcyBQbHVzQ2FsY3VsYXRvcjoKICAgIHg6IGludCA9IDEKICAgIHk6IGludCA9IDIKICAgIHJlc3VsdDogaW50ID0gTm9uZQoKICAgIEBkZWZhdWx0X3NlbGYKICAgIGRlZiBwbHVzKHNlbGYsIHg9REVGQVVMVCwgeT1ERUZBVUxUKToKICAgICAgICBzZWxmLnJlc3VsdCA9IHggKyB5CiAgICAgICAgcmV0dXJuIHNlbGYucmVzdWx0CgpwYyA9IFBsdXNDYWxjdWxhdG9yKCkKcHJpbnQocGMucGx1cygpKQpwcmludChwYy5wbHVzKDQsIDUpKQpwcmludChwYy5wbHVzKHk9MykpCnByaW50KHBjLnBsdXMoeD0yLCB5PTMpKQ==