Python Argparse:带有可选参数的问题是负数

Ger*_*Ger 28 python negative-number argparse

我有一个小问题argparse.我有一个选项xlim,是xrange一个情节.我希望能够传递数字-2e-5.然而,这不起作用 - argparse解释这是一个位置论证.如果我这样做-0.00002:argparse将其作为负数读取.是否有可能读入-2e-3

代码如下,我将如何运行它的一个例子是:

./blaa.py --xlim -2.e-3 1e4 
Run Code Online (Sandbox Code Playgroud)

如果我执行以下操作,它可以工作:

./blaa.py --xlim -0.002 1e4 
Run Code Online (Sandbox Code Playgroud)

代码:

parser.add_argument('--xlim', nargs = 2,
                  help = 'X axis limits',
                  action = 'store', type = float, 
                  default = [-1.e-3, 1.e-3])
Run Code Online (Sandbox Code Playgroud)

虽然我可以通过这种方式使用它,但我真的宁愿能够使用科学记数法.有人有主意吗?

干杯

itu*_*tub 28

我发现的一个解决方法是引用值,但添加一个空格.那是,

./blaa.py --xlim " -2.e-3" 1e4
Run Code Online (Sandbox Code Playgroud)

这样argparse就不会认为-2.e-3是一个选项名称,因为第一个字符不是连字符破折号,但它仍然可以正确转换为浮点数,因为float(string)会忽略左边的空格.

  • 聪明的。但是,如果您的类型是 `str`(默认值)而不是 `float`,则您的选项值将有一个额外的空间需要去除。[更一般的解决方法](/sf/answers/3434260021/) 是使用等号:`--xlim=-2.e-3 1e4`。 (3认同)

jco*_*ado 13

正如评论已经指出的那样,问题是-前缀被解析为一个选项而不是一个参数.解决此问题的一种方法是使用prefix_chars参数更改用于选项的前缀:

#!/usr/bin/python
import argparse

parser = argparse.ArgumentParser(prefix_chars='@')
parser.add_argument('@@xlim', nargs = 2,
                  help = 'X axis limits',
                  action = 'store', type = float,
                  default = [-1.e-3, 1.e-3])
print parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

示例输出:

$ ./blaa.py @@xlim -2.e-3 1e4
Namespace(xlim=[-0.002, 10000.0])
Run Code Online (Sandbox Code Playgroud)

编辑:或者,您可以继续使用-作为分隔符,xlim作为单个值传递并使用函数type 来实现您自己的解析:

#!/usr/bin/python
import argparse

def two_floats(value):
    values = value.split()
    if len(values) != 2:
        raise argparse.ArgumentError
    values = map(float, values)
    return values

parser = argparse.ArgumentParser()
parser.add_argument('--xlim', 
                  help = 'X axis limits',
                  action = 'store', type=two_floats,
                  default = [-1.e-3, 1.e-3])
print parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

示例输出:

$ ./blaa.py --xlim "-2e-3 1e4"
Namespace(xlim=[-0.002, 10000.0])
Run Code Online (Sandbox Code Playgroud)


mxx*_*xxk 7

如果用等号指定选项的值argparse,即使它以-:开头,也不会将其视为单独的选项:

./blaa.py --xlim='-0.002 1e4'
# As opposed to --xlim '-0.002 1e4'
Run Code Online (Sandbox Code Playgroud)

如果该值中没有空格,则可以删除引号:

./blaa.py --xlim=-0.002
Run Code Online (Sandbox Code Playgroud)

请参阅:https//www.gnu.org/software/guile/manual/html_node/Command-Line-Format.html

这样,您就无需编写自己的type=解析器或将前缀字符从重新定义为,-@可以接受。


toe*_*oes 6

另一个解决方法是=除了引用参数之外还使用' '符号传递参数 - 即,--xlim="-2.3e14"


小智 5

这是我使用的代码.(它类似于jeremiahbuddha,但它更直接地回答了这个问题,因为它处理负数.)

在打电话之前把这个 argparse.ArgumentParser()

for i, arg in enumerate(sys.argv):
  if (arg[0] == '-') and arg[1].isdigit(): sys.argv[i] = ' ' + arg
Run Code Online (Sandbox Code Playgroud)