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.