Added dataclass field.init features.
This commit is contained in:
@ -214,6 +214,8 @@ class AttributesData:
|
|||||||
return default_field.default_factory()
|
return default_field.default_factory()
|
||||||
# Extract the default values from all fields.
|
# Extract the default values from all fields.
|
||||||
defaults = {name: get_default(default_field) for name, default_field in self.__dataclass_fields__.items() if default_field.init}
|
defaults = {name: get_default(default_field) for name, default_field in self.__dataclass_fields__.items() if default_field.init}
|
||||||
|
# Hard defaults cannot be a given parameter in the __init__.
|
||||||
|
hard_defaults = {name: get_default(default_field) for name, default_field in self.__dataclass_fields__.items() if not default_field.init}
|
||||||
# Verify not too many args are passed in.
|
# Verify not too many args are passed in.
|
||||||
if len(args) > len(defaults):
|
if len(args) > len(defaults):
|
||||||
raise TypeError(f"__init__ takes {len(defaults)} positional arguments but {len(args)} were given")
|
raise TypeError(f"__init__ takes {len(defaults)} positional arguments but {len(args)} were given")
|
||||||
@ -226,7 +228,7 @@ class AttributesData:
|
|||||||
for name in kwargs.keys() - self.__dataclass_fields__.keys():
|
for name in kwargs.keys() - self.__dataclass_fields__.keys():
|
||||||
raise TypeError(f"__init__ got an unexpected keyword argument '{name}'")
|
raise TypeError(f"__init__ got an unexpected keyword argument '{name}'")
|
||||||
# Merge the defaults, args, and kwargs.
|
# Merge the defaults, args, and kwargs.
|
||||||
for name, value in {**defaults, **args, **kwargs}.items():
|
for name, value in {**defaults, **args, **kwargs, **hard_defaults}.items():
|
||||||
# Ignore None values if self already has that attribute.
|
# Ignore None values if self already has that attribute.
|
||||||
if value is not None or name not in dir(self):
|
if value is not None or name not in dir(self):
|
||||||
setattr(self, name, value)
|
setattr(self, name, value)
|
||||||
|
|||||||
Reference in New Issue
Block a user