134
134
135
135
136
136
import atexit
137
- from collections import namedtuple , ChainMap , defaultdict
137
+ from collections import namedtuple , ChainMap
138
138
from collections .abc import MutableMapping , Mapping
139
139
import contextlib
140
140
import functools
@@ -691,7 +691,7 @@ def _split_key(self, key, sep="."):
691
691
keys = key .split (sep , maxsplit = 1 )
692
692
return keys , len (keys )
693
693
694
- def _set (self , key , value ):
694
+ def _set (self , key , val ):
695
695
"""
696
696
Directly write data bypassing deprecation and validation logic.
697
697
@@ -712,10 +712,22 @@ def _set(self, key, value):
712
712
keys , depth = self ._split_key (key )
713
713
if depth == 1 :
714
714
if key in self .single_key_set :
715
- self ._namespace_maps ["default" ][key ] = value
716
- self ._namespace_maps [key ] = value
715
+ self ._namespace_maps ["default" ][key ] = val
716
+ # Uncomment the following line and remove the raise statement
717
+ # to enable setting namespaces.
718
+ # else:
719
+ # if isinstance(val, dict):
720
+ # self._namespace_maps[key] = ChainMap({}, val)
721
+ # else:
722
+ # raise ValueError(
723
+ # f"{key} should be set using a dictionary but found "
724
+ # f"{type(val)}")
725
+ else :
726
+ raise KeyError (
727
+ f"{ key } is not a valid rc parameter (see rcParams.keys() for "
728
+ f"a list of valid parameters)" )
717
729
elif depth == 2 :
718
- self ._namespace_maps [keys [0 ]][keys [1 ]] = value
730
+ self ._namespace_maps [keys [0 ]][keys [1 ]] = val
719
731
720
732
def _get (self , key ):
721
733
"""
@@ -740,7 +752,7 @@ def _get(self, key):
740
752
if depth == 1 :
741
753
if key in self .single_key_set :
742
754
return self ._namespace_maps ["default" ].get (key )
743
- # Comment the following line and remove the raise statement
755
+ # Uncomment the following line and remove the raise statement
744
756
# to enable getting namespace parameters.
745
757
# return self._namespace_maps[key]
746
758
else :
@@ -807,22 +819,31 @@ def __getitem__(self, key):
807
819
808
820
def _get_backend_or_none (self ):
809
821
"""Get the requested backend, if any, without triggering resolution."""
810
- backend = self ._get ("default. backend" )
822
+ backend = self ._get ("backend" )
811
823
return None if backend is rcsetup ._auto_backend_sentinel else backend
812
824
813
825
def __delitem__ (self , key ):
814
826
keys , depth = self ._split_key (key )
815
- if depth == 1 :
816
- del self ._namespace_maps [key ]
817
- elif depth == 2 :
818
- del self ._namespace_maps [keys [0 ]][keys [1 ]]
827
+ try :
828
+ if depth == 1 :
829
+ if key in self .single_key_set :
830
+ del self ._namespace_maps ["default" ][key ]
831
+ else :
832
+ raise KeyError
833
+ elif depth == 2 :
834
+ del self ._namespace_maps [keys [0 ]][keys [1 ]]
835
+ except KeyError as err :
836
+ raise KeyError (
837
+ f"{ key } is not a valid rc parameter (see rcParams.keys() for "
838
+ f"a list of valid parameters)" ) from err
819
839
820
840
def __contains__ (self , key ):
821
841
keys , depth = self ._split_key (key )
822
842
if depth == 1 :
823
843
if key in self .single_key_set :
824
844
return key in self ._namespace_maps ["default" ]
825
- return key in self ._namespace_maps
845
+ else :
846
+ return False
826
847
elif depth == 2 :
827
848
return any (key in mapping for mapping in self ._namespace_maps )
828
849
@@ -865,15 +886,22 @@ def items(self):
865
886
def pop (self , key ):
866
887
keys , depth = self ._split_key (key )
867
888
if depth == 1 :
868
- self ._mapping .pop ()
889
+ if key in self .single_key_set :
890
+ return self ._namespace_mapping ["default" ][key ]
891
+ else :
892
+ raise KeyError (
893
+ f"{ key } is not a valid rc parameter (see rcParams.keys() for "
894
+ f"a list of valid parameters)" )
869
895
elif depth == 2 :
870
- self ._namespace_mapping [keys [0 ]].pop (keys [1 ])
896
+ return self ._namespace_mapping [keys [0 ]].pop (keys [1 ])
871
897
872
898
def popitem (self ):
873
- return self ._mapping .popitem ()
899
+ raise NotImplementedError (
900
+ "popitem is not implemented for RcParams." )
874
901
875
902
def clear (self ):
876
- self ._mapping .clear ()
903
+ for namespace in self ._namespace_maps :
904
+ self ._namespace_maps [namespace ].clear ()
877
905
878
906
def setdefault (self , key , default = None ):
879
907
self [key ] = default
@@ -1005,6 +1033,8 @@ def _rc_params_in_file(fname, transform=lambda x: x, fail_on_error=False):
1005
1033
config = RcParams ()
1006
1034
1007
1035
for key , (val , line , line_no ) in rc_temp .items ():
1036
+ if key in config .single_key_set :
1037
+ key = f"default.{ key } "
1008
1038
if key in rcsetup ._validators :
1009
1039
if fail_on_error :
1010
1040
config [key ] = val # try to convert to proper type or raise
0 commit comments