diff --git a/gin/config.py b/gin/config.py index 62bf3fc..836db58 100644 --- a/gin/config.py +++ b/gin/config.py @@ -2797,7 +2797,7 @@ def constant(name, value): if not config_parser.MODULE_RE.match(name): raise ValueError("Invalid constant selector '{}'.".format(name)) - if _CONSTANTS.matching_selectors(name): + if not _INTERACTIVE_MODE and _CONSTANTS.matching_selectors(name): err_str = "Constants matching selector '{}' already exist ({})." raise ValueError(err_str.format(name, _CONSTANTS.matching_selectors(name))) diff --git a/tests/config_test.py b/tests/config_test.py index 4622ddc..44c8c3e 100644 --- a/tests/config_test.py +++ b/tests/config_test.py @@ -2114,6 +2114,20 @@ def duplicate_fn4(): # pylint: disable=unused-variable config.parse_config(config_str) self.assertEqual(ConfigurableClass().kwarg1, 'duplicate_fn3') + config.constant('CONST1', 42) + with self.assertRaisesRegex(ValueError, 'already exist'): + config.constant('CONST1', 42) + + with config.interactive_mode(): + config.constant('CONST1', 43) + + config_str = """ + configurable2.non_kwarg = %CONST1 + """ + config.parse_config(config_str) + non_kwarg, _ = configurable2() # pylint:disable=no-value-for-parameter + self.assertIs(non_kwarg, 43) + def testFinalizeLocksConfig(self): config.finalize() with self.assertRaises(RuntimeError):