From 673e76b86282859ead5517bd04dee896a647db93 Mon Sep 17 00:00:00 2001 From: Glenn Jocher Date: Fri, 26 Jul 2024 05:28:17 +0200 Subject: [PATCH] `SETTINGS` type and key checks (#14703) Signed-off-by: Glenn Jocher --- ultralytics/utils/__init__.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/ultralytics/utils/__init__.py b/ultralytics/utils/__init__.py index 39f6ad2b..db9456d6 100644 --- a/ultralytics/utils/__init__.py +++ b/ultralytics/utils/__init__.py @@ -975,6 +975,11 @@ class SettingsManager(dict): "tensorboard": True, "wandb": True, } + self.help_msg = ( + f"\nView settings with 'yolo settings' or at '{self.file}'" + "\nUpdate settings with 'yolo settings key=value', i.e. 'yolo settings runs_dir=path/to/dir'. " + "For help see https://docs.ultralytics.com/quickstart/#ultralytics-settings." + ) super().__init__(copy.deepcopy(self.defaults)) @@ -986,15 +991,10 @@ class SettingsManager(dict): correct_keys = self.keys() == self.defaults.keys() correct_types = all(type(a) is type(b) for a, b in zip(self.values(), self.defaults.values())) correct_version = check_version(self["settings_version"], self.version) - help_msg = ( - f"\nView settings with 'yolo settings' or at '{self.file}'" - "\nUpdate settings with 'yolo settings key=value', i.e. 'yolo settings runs_dir=path/to/dir'. " - "For help see https://docs.ultralytics.com/quickstart/#ultralytics-settings." - ) if not (correct_keys and correct_types and correct_version): LOGGER.warning( "WARNING ⚠️ Ultralytics settings reset to default values. This may be due to a possible problem " - f"with your settings or a recent ultralytics package update. {help_msg}" + f"with your settings or a recent ultralytics package update. {self.help_msg}" ) self.reset() @@ -1002,7 +1002,7 @@ class SettingsManager(dict): LOGGER.warning( f"WARNING ⚠️ Ultralytics setting 'datasets_dir: {self.get('datasets_dir')}' " f"must be different than 'runs_dir: {self.get('runs_dir')}'. " - f"Please change one to avoid possible issues during training. {help_msg}" + f"Please change one to avoid possible issues during training. {self.help_msg}" ) def load(self): @@ -1015,6 +1015,12 @@ class SettingsManager(dict): def update(self, *args, **kwargs): """Updates a setting value in the current settings.""" + for k, v in kwargs.items(): + if k not in self.defaults: + raise KeyError(f"No Ultralytics setting '{k}'. {self.help_msg}") + t = type(self.defaults[k]) + if not isinstance(v, t): + raise TypeError(f"Ultralytics setting '{k}' must be of type '{t}', not '{type(v)}'. {self.help_msg}") super().update(*args, **kwargs) self.save()