python - argparse 不转换默认数字参数?

标签 python python-2.7 argparse

有些代码行值一千字。使用以下内容创建一个 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 仍然是 intdefault=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/

相关文章:

python - 如何优化我的代码以加快处理速度?

python - 只计算一次属性并多次使用结果(不同的方法)

Python 二维数组求和枚举

python argparse - 如何允许解析器处理标志和非标志参数

python - 翻译 argparse 的内部字符串

python - 将之前的参数传递给下一个 django 模板请求

python - 如何使用 {% include "app"%} 之类的东西将我的 Django 应用程序的结果嵌入到模板中?

python - Python 中的时序模幂运算 : syntax vs function

python - 如果 Dataframe 中的行包含某些字符串删除

Python argparse : Is there a way to print help for only a specific parameter?