From b81d1614af7674d9c2a9cce059a045c96ff9a890 Mon Sep 17 00:00:00 2001 From: SimpleArt <71458112+SimpleArt@users.noreply.github.com> Date: Thu, 8 Jul 2021 10:47:11 -0400 Subject: [PATCH] Added dataclass field.init features. --- EasyGA/attributes.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/EasyGA/attributes.py b/EasyGA/attributes.py index 4d3564d..287921c 100644 --- a/EasyGA/attributes.py +++ b/EasyGA/attributes.py @@ -214,6 +214,8 @@ class AttributesData: return default_field.default_factory() # 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} + # 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. if len(args) > len(defaults): 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(): raise TypeError(f"__init__ got an unexpected keyword argument '{name}'") # 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. if value is not None or name not in dir(self): setattr(self, name, value)