argparse support of/by argparse

lucas lucas at bourneuf.net
Tue Jul 13 12:56:19 EDT 2021


Mmmh, that may work just fine !
Thanks for that idea, ChrisA, i'm looking forward to implement that.

Best wishes,
--lucas



On 12/07/2021 21:33, Chris Angelico wrote:
> On Tue, Jul 13, 2021 at 5:22 AM lucas <lucas at bourneuf.net> wrote:
>>
>> Hello everyone,
>>
>> Let us consider this patch of code:
>>
>>       import argparse
>>
>>       def parse_cli() -> argparse.Namespace:
>>           parser = argparse.ArgumentParser()
>>           parser.add_argument('n', type=int)
>>           return parser.parse_args()
>>
>>       args = parse_cli()
>>       print(args.n + ' ')  # type error
>>
>> Running CPython on it will raise a TypeError, and running Mypy on it
>> will indicate that no issues were found.
>>
>> I was wondering if there is any way for me to have mypy detecting the
>> args.n type, based on the type keyword of the parser.add_argument function ?
>>
>> It appears that some type annotations were added to tierce party
>> modules, provided by mypy itself. Is there a technical issue preventing
>> such work to be made for argparse (or other CLI ; i didn't find anything
>> for others either)
>>
> 
> Seems complicated, since it depends on a lot of run-time information.
> What if you flip the problem on its head? Instead of creating the
> argparser and letting that govern the types, maybe create a dataclass,
> and then programmatically build the parser.
> 
> from dataclasses import dataclass
> import argparse
> 
> @dataclass
> class Args:
>      n: int
> 
> def parse_cli() -> Args:
>      parser = argparse.ArgumentParser()
>      for field, typ in Args.__dataclass_fields__.items():
>          if hasattr(typ, "type"): typ = typ.type # Python 3.10 changed
> things a bit
>          parser.add_argument(field, type=typ)
>      return Args(**vars(parser.parse_args()))
> 
> args = parse_cli()
> print(args.n + ' ')
> 
> 
> Only barely tested it and didn't try MyPy, but that's the basic idea.
> You'd have to figure out the tidiest way to define all the other
> attributes of your arguments (help text, etc), but ideally, all the
> info should be able to be coded in the dataclass.
> 
> Incidentally, you could choose to make parse_cli into a classmethod of
> Args. Might be cleaner.
> 
> ChrisA
> 


More information about the Python-list mailing list