51
51
from collections import namedtuple
52
52
from contextlib import contextmanager
53
53
import re
54
- from typing import Dict , List
54
+ from typing import Any , Dict , Iterable , List
55
55
import warnings
56
56
57
57
DeprecatedOption = namedtuple ("DeprecatedOption" , "key msg rkey removal_ver" )
64
64
_registered_options : Dict [str , RegisteredOption ] = {}
65
65
66
66
# holds the current values for registered options
67
- _global_config : Dict [str , str ] = {}
67
+ _global_config : Dict [str , Any ] = {}
68
68
69
69
# keys which have a special meaning
70
70
_reserved_keys : List [str ] = ["all" ]
@@ -85,7 +85,7 @@ def _get_single_key(pat, silent):
85
85
if len (keys ) == 0 :
86
86
if not silent :
87
87
_warn_if_deprecated (pat )
88
- raise OptionError ("No such keys(s): {pat!r}" . format (pat = pat ) )
88
+ raise OptionError (f "No such keys(s): { repr (pat ) } " )
89
89
if len (keys ) > 1 :
90
90
raise OptionError ("Pattern matched multiple keys" )
91
91
key = keys [0 ]
@@ -116,8 +116,8 @@ def _set_option(*args, **kwargs):
116
116
silent = kwargs .pop ("silent" , False )
117
117
118
118
if kwargs :
119
- msg = '_set_option() got an unexpected keyword argument "{kwarg}"'
120
- raise TypeError (msg . format ( list ( kwargs . keys ())[ 0 ]) )
119
+ kwarg = list ( kwargs . keys ())[ 0 ]
120
+ raise TypeError (f'_set_option() got an unexpected keyword argument " { kwarg } "' )
121
121
122
122
for k , v in zip (args [::2 ], args [1 ::2 ]):
123
123
key = _get_single_key (k , silent )
@@ -412,7 +412,7 @@ def __exit__(self, *args):
412
412
_set_option (pat , val , silent = True )
413
413
414
414
415
- def register_option (key , defval , doc = "" , validator = None , cb = None ):
415
+ def register_option (key : str , defval : object , doc = "" , validator = None , cb = None ):
416
416
"""Register an option in the package-wide pandas config object
417
417
418
418
Parameters
@@ -441,11 +441,9 @@ def register_option(key, defval, doc="", validator=None, cb=None):
441
441
key = key .lower ()
442
442
443
443
if key in _registered_options :
444
- msg = "Option '{key}' has already been registered"
445
- raise OptionError (msg .format (key = key ))
444
+ raise OptionError (f"Option '{ key } ' has already been registered" )
446
445
if key in _reserved_keys :
447
- msg = "Option '{key}' is a reserved key"
448
- raise OptionError (msg .format (key = key ))
446
+ raise OptionError (f"Option '{ key } ' is a reserved key" )
449
447
450
448
# the default value should be legal
451
449
if validator :
@@ -455,10 +453,12 @@ def register_option(key, defval, doc="", validator=None, cb=None):
455
453
path = key .split ("." )
456
454
457
455
for k in path :
458
- if not bool (re .match ("^" + tokenize .Name + "$" , k )):
459
- raise ValueError ("{k} is not a valid identifier" .format (k = k ))
456
+ # NOTE: tokenize.Name is not a public constant
457
+ # error: Module has no attribute "Name" [attr-defined]
458
+ if not re .match ("^" + tokenize .Name + "$" , k ): # type: ignore
459
+ raise ValueError (f"{ k } is not a valid identifier" )
460
460
if keyword .iskeyword (k ):
461
- raise ValueError ("{k} is a python keyword" . format ( k = k ) )
461
+ raise ValueError (f "{ k } is a python keyword" )
462
462
463
463
cursor = _global_config
464
464
msg = "Path prefix to option '{option}' is already an option"
@@ -522,8 +522,7 @@ def deprecate_option(key, msg=None, rkey=None, removal_ver=None):
522
522
key = key .lower ()
523
523
524
524
if key in _deprecated_options :
525
- msg = "Option '{key}' has already been defined as deprecated."
526
- raise OptionError (msg .format (key = key ))
525
+ raise OptionError (f"Option '{ key } ' has already been defined as deprecated." )
527
526
528
527
_deprecated_options [key ] = DeprecatedOption (key , msg , rkey , removal_ver )
529
528
@@ -621,11 +620,11 @@ def _warn_if_deprecated(key):
621
620
print (d .msg )
622
621
warnings .warn (d .msg , FutureWarning )
623
622
else :
624
- msg = "'{key}' is deprecated" . format ( key = key )
623
+ msg = f "'{ key } ' is deprecated"
625
624
if d .removal_ver :
626
- msg += " and will be removed in {version}" . format ( version = d .removal_ver )
625
+ msg += f " and will be removed in { d .removal_ver } "
627
626
if d .rkey :
628
- msg += ", please use '{rkey}' instead." . format ( rkey = d . rkey )
627
+ msg += f ", please use '{ d . rkey } ' instead."
629
628
else :
630
629
msg += ", please refrain from using it."
631
630
@@ -640,17 +639,15 @@ def _build_option_description(k):
640
639
o = _get_registered_option (k )
641
640
d = _get_deprecated_option (k )
642
641
643
- s = "{k} " . format ( k = k )
642
+ s = f "{ k } "
644
643
645
644
if o .doc :
646
645
s += "\n " .join (o .doc .strip ().split ("\n " ))
647
646
else :
648
647
s += "No description available."
649
648
650
649
if o :
651
- s += "\n [default: {default}] [currently: {current}]" .format (
652
- default = o .defval , current = _get_option (k , True )
653
- )
650
+ s += f"\n [default: { o .defval } ] [currently: { _get_option (k , True )} ]"
654
651
655
652
if d :
656
653
s += "\n (Deprecated"
@@ -666,7 +663,7 @@ def pp_options_list(keys, width=80, _print=False):
666
663
from textwrap import wrap
667
664
from itertools import groupby
668
665
669
- def pp (name , ks ) :
666
+ def pp (name : str , ks : Iterable [ str ]) -> List [ str ] :
670
667
pfx = "- " + name + ".[" if name else ""
671
668
ls = wrap (
672
669
", " .join (ks ),
@@ -679,7 +676,7 @@ def pp(name, ks):
679
676
ls [- 1 ] = ls [- 1 ] + "]"
680
677
return ls
681
678
682
- ls = []
679
+ ls : List [ str ] = []
683
680
singles = [x for x in sorted (keys ) if x .find ("." ) < 0 ]
684
681
if singles :
685
682
ls += pp ("" , singles )
@@ -731,7 +728,7 @@ def config_prefix(prefix):
731
728
732
729
def wrap (func ):
733
730
def inner (key , * args , ** kwds ):
734
- pkey = "{prefix}.{key}" . format ( prefix = prefix , key = key )
731
+ pkey = f "{ prefix } .{ key } "
735
732
return func (pkey , * args , ** kwds )
736
733
737
734
return inner
@@ -768,8 +765,7 @@ def is_type_factory(_type):
768
765
769
766
def inner (x ):
770
767
if type (x ) != _type :
771
- msg = "Value must have type '{typ!s}'"
772
- raise ValueError (msg .format (typ = _type ))
768
+ raise ValueError (f"Value must have type '{ _type } '" )
773
769
774
770
return inner
775
771
@@ -792,12 +788,11 @@ def is_instance_factory(_type):
792
788
_type = tuple (_type )
793
789
type_repr = "|" .join (map (str , _type ))
794
790
else :
795
- type_repr = "'{typ }'" . format ( typ = _type )
791
+ type_repr = f "'{ _type } '"
796
792
797
793
def inner (x ):
798
794
if not isinstance (x , _type ):
799
- msg = "Value must be an instance of {type_repr}"
800
- raise ValueError (msg .format (type_repr = type_repr ))
795
+ raise ValueError (f"Value must be an instance of { type_repr } " )
801
796
802
797
return inner
803
798
@@ -813,10 +808,10 @@ def inner(x):
813
808
if not any (c (x ) for c in callables ):
814
809
uvals = [str (lval ) for lval in legal_values ]
815
810
pp_values = "|" .join (uvals )
816
- msg = "Value must be one of {pp_values}"
811
+ msg = f "Value must be one of { pp_values } "
817
812
if len (callables ):
818
813
msg += " or a callable"
819
- raise ValueError (msg . format ( pp_values = pp_values ) )
814
+ raise ValueError (msg )
820
815
821
816
return inner
822
817
0 commit comments