from dataclasses import dataclass
from inspect import signature, Parameter
def lax_dataclass(cls_or_None=None, **kwargs):
def decorator(cls):
def __init__(self, *args, **kwargs):
orig_init(self, *args, **{
name: value for name, value in kwargs.items() if name in accepted_keywords
})
cls = dataclass(**kwargs)(cls)
orig_init = cls.__init__
accepted_keywords = {
param.name for param in signature(orig_init).parameters.values()
if param.kind in (Parameter.POSITIONAL_OR_KEYWORD, Parameter.KEYWORD_ONLY)
}
cls.__init__ = __init__
return cls
if cls_or_None is None:
return decorator
return decorator(cls_or_None)
@lax_dataclass
class MyClass:
a: int
print(MyClass(20, **{"kwarg1" : 1}))
ZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmZyb20gaW5zcGVjdCBpbXBvcnQgc2lnbmF0dXJlLCBQYXJhbWV0ZXIKCmRlZiBsYXhfZGF0YWNsYXNzKGNsc19vcl9Ob25lPU5vbmUsICoqa3dhcmdzKToKICAgIGRlZiBkZWNvcmF0b3IoY2xzKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgb3JpZ19pbml0KHNlbGYsICphcmdzLCAqKnsKICAgICAgICAgICAgICAgIG5hbWU6IHZhbHVlIGZvciBuYW1lLCB2YWx1ZSBpbiBrd2FyZ3MuaXRlbXMoKSBpZiBuYW1lIGluIGFjY2VwdGVkX2tleXdvcmRzCiAgICAgICAgICAgIH0pCiAgICAgICAgY2xzID0gZGF0YWNsYXNzKCoqa3dhcmdzKShjbHMpCiAgICAgICAgb3JpZ19pbml0ID0gY2xzLl9faW5pdF9fCiAgICAgICAgYWNjZXB0ZWRfa2V5d29yZHMgPSB7CiAgICAgICAgICAgIHBhcmFtLm5hbWUgZm9yIHBhcmFtIGluIHNpZ25hdHVyZShvcmlnX2luaXQpLnBhcmFtZXRlcnMudmFsdWVzKCkKICAgICAgICAgICAgaWYgcGFyYW0ua2luZCBpbiAoUGFyYW1ldGVyLlBPU0lUSU9OQUxfT1JfS0VZV09SRCwgUGFyYW1ldGVyLktFWVdPUkRfT05MWSkKICAgICAgICB9CiAgICAgICAgY2xzLl9faW5pdF9fID0gX19pbml0X18KICAgICAgICByZXR1cm4gY2xzCiAgICBpZiBjbHNfb3JfTm9uZSBpcyBOb25lOgogICAgICAgIHJldHVybiBkZWNvcmF0b3IKICAgIHJldHVybiBkZWNvcmF0b3IoY2xzX29yX05vbmUpCgpAbGF4X2RhdGFjbGFzcwpjbGFzcyBNeUNsYXNzOgogICAgYTogaW50CgpwcmludChNeUNsYXNzKDIwLCAqKnsia3dhcmcxIiA6IDF9KSk=