@@ -476,23 +476,24 @@ def get(
476476 sysenv_fallback = self ._store .get ("SYSENV_FALLBACK_FOR_DYNACONF" )
477477
478478 nested_sep = self ._store .get ("NESTED_SEPARATOR_FOR_DYNACONF" )
479- if nested_sep and nested_sep in key :
480- # turn FOO__bar__ZAZ in `FOO.bar.ZAZ`
481- key = key .replace (nested_sep , "." )
482-
483- if dotted_lookup is empty :
484- dotted_lookup = self ._store .get ("DOTTED_LOOKUP_FOR_DYNACONF" )
485-
486- if "." in key and dotted_lookup :
487- return self ._dotted_get (
488- dotted_key = key ,
489- default = default ,
490- cast = cast ,
491- fresh = fresh ,
492- parent = parent ,
493- )
479+ if isinstance (key , str ):
480+ if nested_sep and nested_sep in key :
481+ # turn FOO__bar__ZAZ in `FOO.bar.ZAZ`
482+ key = key .replace (nested_sep , "." )
483+
484+ if dotted_lookup is empty :
485+ dotted_lookup = self ._store .get ("DOTTED_LOOKUP_FOR_DYNACONF" )
486+
487+ if "." in key and dotted_lookup :
488+ return self ._dotted_get (
489+ dotted_key = key ,
490+ default = default ,
491+ cast = cast ,
492+ fresh = fresh ,
493+ parent = parent ,
494+ )
494495
495- key = upperfy (key )
496+ key = upperfy (key )
496497
497498 # handles system environment fallback
498499 if default is None :
@@ -913,7 +914,7 @@ def set(
913914 ):
914915 """Set a value storing references for the loader
915916
916- :param key: The key to store
917+ :param key: The key to store. Can be of any type.
917918 :param value: The raw value to parse and store
918919 :param loader_identifier: Optional loader name e.g: toml, yaml etc.
919920 Or isntance of SourceMetadata
@@ -938,20 +939,21 @@ def set(
938939 if dotted_lookup is empty :
939940 dotted_lookup = self .get ("DOTTED_LOOKUP_FOR_DYNACONF" )
940941 nested_sep = self .get ("NESTED_SEPARATOR_FOR_DYNACONF" )
941- if nested_sep and nested_sep in key :
942- key = key .replace (nested_sep , "." ) # FOO__bar -> FOO.bar
943-
944- if "." in key and dotted_lookup is True :
945- return self ._dotted_set (
946- key ,
947- value ,
948- loader_identifier = source_metadata ,
949- tomlfy = tomlfy ,
950- validate = validate ,
951- )
942+ if isinstance (key , str ):
943+ if nested_sep and nested_sep in key :
944+ key = key .replace (nested_sep , "." ) # FOO__bar -> FOO.bar
945+
946+ if "." in key and dotted_lookup is True :
947+ return self ._dotted_set (
948+ key ,
949+ value ,
950+ loader_identifier = source_metadata ,
951+ tomlfy = tomlfy ,
952+ validate = validate ,
953+ )
954+ key = upperfy (key .strip ())
952955
953956 parsed = parse_conf_data (value , tomlfy = tomlfy , box_settings = self )
954- key = upperfy (key .strip ())
955957
956958 # Fix for #869 - The call to getattr trigger early evaluation
957959 existing = (
@@ -1001,7 +1003,12 @@ def set(
10011003 # Set the parsed value
10021004 self .store [key ] = parsed
10031005 self ._deleted .discard (key )
1004- super ().__setattr__ (key , parsed )
1006+
1007+ # check if str because we can't directly set/get non-str with obj. e.g.
1008+ # setting.1
1009+ # settings.(1,2)
1010+ if isinstance (key , str ):
1011+ super ().__setattr__ (key , parsed )
10051012
10061013 # Track history for inspect, store the raw_value
10071014 if source_metadata in self ._loaded_by_loaders :
0 commit comments