@@ -87,6 +87,8 @@ class Flag(Generic[_T]):
87
87
default_as_str : Optional [str ]
88
88
default_unparsed : Union [Optional [_T ], str ]
89
89
90
+ parser : _argument_parser .ArgumentParser [_T ]
91
+
90
92
def __init__ (
91
93
self ,
92
94
parser : _argument_parser .ArgumentParser [_T ],
@@ -111,7 +113,7 @@ def __init__(
111
113
self .short_name = short_name
112
114
self .boolean = boolean
113
115
self .present = 0
114
- self .parser = parser
116
+ self .parser = parser # type: ignore[annotation-type-mismatch]
115
117
self .serializer = serializer
116
118
self .allow_override = allow_override
117
119
self .allow_override_cpp = allow_override_cpp
@@ -120,8 +122,8 @@ def __init__(
120
122
self .allow_using_method_names = allow_using_method_names
121
123
122
124
self .using_default_value = True
123
- self ._value = None
124
- self .validators = []
125
+ self ._value : Optional [ _T ] = None
126
+ self .validators : List [ Any ] = []
125
127
if self .allow_hide_cpp and self .allow_override_cpp :
126
128
raise _exceptions .Error (
127
129
"Can't have both allow_hide_cpp (means use Python flag) and "
@@ -177,7 +179,7 @@ def _get_parsed_value_as_string(self, value: Optional[_T]) -> Optional[str]:
177
179
return repr ('false' )
178
180
return repr (str (value ))
179
181
180
- def parse (self , argument : Union [str , Optional [ _T ] ]) -> None :
182
+ def parse (self , argument : Union [str , _T ]) -> None :
181
183
"""Parses string and sets flag value.
182
184
183
185
Args:
@@ -202,7 +204,7 @@ def _parse(self, argument: Union[str, _T]) -> Optional[_T]:
202
204
The parsed value.
203
205
"""
204
206
try :
205
- return self .parser .parse (argument )
207
+ return self .parser .parse (argument ) # type: ignore[arg-type]
206
208
except (TypeError , ValueError , OverflowError ) as e :
207
209
# Recast as IllegalFlagValueError.
208
210
raise _exceptions .IllegalFlagValueError (
@@ -298,7 +300,7 @@ def _create_xml_dom_element(
298
300
else :
299
301
default_serialized = ''
300
302
else :
301
- default_serialized = self .default
303
+ default_serialized = self .default # type: ignore[assignment]
302
304
element .appendChild (_helpers .create_xml_dom_element (
303
305
doc , 'default' , default_serialized ))
304
306
value_serialized = self ._serialize_value_for_xml (self .value )
@@ -363,6 +365,8 @@ def __init__(
363
365
class EnumFlag (Flag [str ]):
364
366
"""Basic enum flag; its value can be any string from list of enum_values."""
365
367
368
+ parser : _argument_parser .EnumParser
369
+
366
370
def __init__ (
367
371
self ,
368
372
name : str ,
@@ -374,11 +378,11 @@ def __init__(
374
378
** args
375
379
):
376
380
p = _argument_parser .EnumParser (enum_values , case_sensitive )
381
+ g : _argument_parser .ArgumentSerializer [str ]
377
382
g = _argument_parser .ArgumentSerializer ()
378
383
super (EnumFlag , self ).__init__ (
379
- p , g , name , default , help , short_name , ** args )
380
- # NOTE: parser should be typed EnumParser but the constructor
381
- # restricts the available interface to ArgumentParser[str].
384
+ p , g , name , default , help , short_name , ** args
385
+ )
382
386
self .parser = p
383
387
self .help = '<%s>: %s' % ('|' .join (p .enum_values ), self .help )
384
388
@@ -395,6 +399,8 @@ def _extra_xml_dom_elements(
395
399
class EnumClassFlag (Flag [_ET ]):
396
400
"""Basic enum flag; its value is an enum class's member."""
397
401
402
+ parser : _argument_parser .EnumClassParser
403
+
398
404
def __init__ (
399
405
self ,
400
406
name : str ,
@@ -406,12 +412,13 @@ def __init__(
406
412
** args
407
413
):
408
414
p = _argument_parser .EnumClassParser (
409
- enum_class , case_sensitive = case_sensitive )
415
+ enum_class , case_sensitive = case_sensitive
416
+ )
417
+ g : _argument_parser .EnumClassSerializer [_ET ]
410
418
g = _argument_parser .EnumClassSerializer (lowercase = not case_sensitive )
411
419
super (EnumClassFlag , self ).__init__ (
412
- p , g , name , default , help , short_name , ** args )
413
- # NOTE: parser should be typed EnumClassParser[_ET] but the constructor
414
- # restricts the available interface to ArgumentParser[_ET].
420
+ p , g , name , default , help , short_name , ** args
421
+ )
415
422
self .parser = p
416
423
self .help = '<%s>: %s' % ('|' .join (p .member_names ), self .help )
417
424
@@ -456,23 +463,28 @@ def parse(self, arguments: Union[str, _T, Iterable[_T]]): # pylint: disable=arg
456
463
"""
457
464
new_values = self ._parse (arguments )
458
465
if self .present :
466
+ assert self .value is not None
459
467
self .value .extend (new_values )
460
468
else :
461
469
self .value = new_values
462
470
self .present += len (new_values )
463
471
464
- def _parse (self , arguments : Union [str , Optional [Iterable [_T ]]]) -> List [_T ]: # pylint: disable=arguments-renamed
465
- if (isinstance (arguments , abc .Iterable ) and
466
- not isinstance (arguments , str )):
467
- arguments = list (arguments )
472
+ def _parse (self , arguments : Union [str , _T , Iterable [_T ]]) -> List [_T ]: # pylint: disable=arguments-renamed
473
+ arguments_list : List [Union [str , _T ]]
474
+
475
+ if isinstance (arguments , str ):
476
+ arguments_list = [arguments ]
468
477
469
- if not isinstance (arguments , list ):
478
+ elif isinstance (arguments , abc .Iterable ):
479
+ arguments_list = list (arguments )
480
+
481
+ else :
470
482
# Default value may be a list of values. Most other arguments
471
483
# will not be, so convert them into a single-item list to make
472
484
# processing simpler below.
473
- arguments = [arguments ]
485
+ arguments_list = [arguments ]
474
486
475
- return [super (MultiFlag , self )._parse (item ) for item in arguments ]
487
+ return [super (MultiFlag , self )._parse (item ) for item in arguments_list ] # type: ignore
476
488
477
489
def _serialize (self , value : Optional [List [_T ]]) -> str :
478
490
"""See base class."""
@@ -483,7 +495,8 @@ def _serialize(self, value: Optional[List[_T]]) -> str:
483
495
return ''
484
496
485
497
serialized_items = [
486
- super (MultiFlag , self )._serialize (value_item ) for value_item in value
498
+ super (MultiFlag , self )._serialize (value_item ) # type: ignore[arg-type]
499
+ for value_item in value
487
500
]
488
501
489
502
return '\n ' .join (serialized_items )
@@ -511,6 +524,8 @@ class MultiEnumClassFlag(MultiFlag[_ET]): # pytype: disable=not-indexable
511
524
type.
512
525
"""
513
526
527
+ parser : _argument_parser .EnumClassParser [_ET ] # type: ignore[assignment]
528
+
514
529
def __init__ (
515
530
self ,
516
531
name : str ,
@@ -522,6 +537,7 @@ def __init__(
522
537
):
523
538
p = _argument_parser .EnumClassParser (
524
539
enum_class , case_sensitive = case_sensitive )
540
+ g : _argument_parser .EnumClassListSerializer
525
541
g = _argument_parser .EnumClassListSerializer (
526
542
list_sep = ',' , lowercase = not case_sensitive )
527
543
super (MultiEnumClassFlag , self ).__init__ (
0 commit comments