有些代码行值一千字。使用以下内容创建一个 python 文件 test.py
:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--G', type=float, default=1, nargs='?')
args = parser.parse_args()
print (args.G / 3)
然后,在终端中:
python test.py
给出 0
,同时:
python test.py --G 1
给出 0.333333333
。我认为这是因为 argparse
似乎没有将 default
参数转换为其正确的类型(因此 1
仍然是 int
在 default=1
中,尽管 type=float
),但如果明确给出,它会强制转换参数。
我认为这是不一致的,容易出错。 argparse
这样做有什么原因吗?
最佳答案
我认为 default=1
中的 1
是在调用 parser.add_argument
时计算的,其中您传递的非默认值因为参数是在运行时计算的,因此可以通过 argparse 转换为 float 。这不是 argparse 的行为方式;这就是 python 的一般行为方式。考虑一下
def foo(x=1):
# there is no way to tell the function body that you want 1.0
# except for explicitly conversion
# because 1 is passed by value, which has already been evaluated
# and determined to be an int
print (x/3)
大量编辑:哈,我现在明白你的意思了,我认为这是合理的。所以我深入研究源代码并查看发现的内容:
https://hg.python.org/cpython/file/3.5/Lib/argparse.py#l1984
所以 argparse
似乎确实确保您的默认值是类型兼容的,只要它是一个字符串。尝试:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--G', type=float, default='1', nargs='?')
args = parser.parse_args()
print (args.G / 3)
不确定这是错误还是妥协...
关于python - argparse 不转换默认数字参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35429336/