Enchancement suggestion for argparse: intuit type from default
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Wed Mar 14 08:53:25 EDT 2012
On Wed, 14 Mar 2012 08:35:12 +1100, Ben Finney wrote:
> roy at panix.com (Roy Smith) writes:
>
>> Using argparse, if I write:
>>
>> parser.add_argument('--foo', default=100)
>>
>> it seems like it should be able to intuit that the type of foo should
>> be int (i.e. type(default))
> […]
>
> -0.5.
>
> That feels too magical to me. I don't see a need to special-case that
> usage. There's not much burden in being explicit for the argument type.
And yet you are programming in Python instead of Java, Pascal or Ada :)
It's not magic at all, it's science! Or to be precise, it's a very simple
form of type inference, similar to (but much more basic than) that used
by languages such as Go, Haskell, Ocaml, and ML.
http://en.wikipedia.org/wiki/Type_inference
Given the premise that arguments in argparser are typed, if the argument
can take the value 100 (the default), it is logical that it can't be a
string (because 100 is not a string) or a boolean (because 100 is not a
boolean) or a list (because... well, you get the point).
What if you want an argument --foo that will accept arbitrary types? Then
you would need some way to tell argparse not to infer the type from the
default.
Python *names* are not typed, but objects are. Python infers the type of
the object from its syntax. We write:
n = 100
and not:
n = int 100
Assuming that argparse arguments are typed, and that there is a way to
over-rule the type-inference, there is no need to declare types in the
common case. Explicit declarations should be used only for the uncommon
cases where type inference cannot cope.
--
Steven
More information about the Python-list
mailing list