以下功能和用法示例说明了我对此用法的确切需求:
test([{True | False}])
:
>>> def test(arg=True):
... if arg:
... print "argument is true"
... else:
... print "argument is false"
...
>>> test()
argument is true
>>> test(True)
argument is true
>>> test(False)
argument is false
>>> test(1)
argument is true
>>> test(0)
argument is false
>>> test("foo")
argument is true
>>> test("")
argument is false
>>>
现在我想要完全相同的用法和行为,但使用命令行解析,即使用此用法:
python test [{True | False}]
所以我试图用这样的东西来解决这个问题:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-arg",
help="I want the usage to be [{True | False}] (defaults to True)")
arg = parser.parse_args().arg
if arg:
print "argument is true"
else:
print "argument is false"
但我无法弄明白。我尝试了各种选项和选项组合,其中action="store_true"
,default=True
,choices=[True, False]
,type=bool
但没有任何效果,例如:
$ python test.py -h
usage: test.py [-h] [-arg ARG]
optional arguments:
-h, --help show this help message and exit
-arg ARG I want the usage to be [{True | False}] (defaults to True)
$ python test.py
argument is true
$ python test.py True
usage: test.py [-h] [-arg ARG]
test.py: error: unrecognized arguments: True
etc.
感谢您的帮助。
答案 0 :(得分:2)
查找或编写一个解析“True”,“False”等字符串的函数。例如 http://www.noah.org/wiki/Python_notes#Parse_Boolean_strings
def ParseBoolean (b):
# ...
if len(b) < 1:
raise ValueError ('Cannot parse empty string into boolean.')
b = b[0].lower()
if b == 't' or b == 'y' or b == '1':
return True
if b == 'f' or b == 'n' or b == '0':
return False
raise ValueError ('Cannot parse string into boolean.')
将此视为int()
和float()
的布尔等价物然后将其用作参数type
p.add_argument('foo',type=ParseBoolean)
bool()
不起作用,因为它解释为False
的唯一字符串是''
。
答案 1 :(得分:1)
如果为参数指定一个以“ - ”开头的名称,它将成为一个标志参数。正如您从“使用”中看到的那样,除了它之外,它被称为test.py -arg True
如果您不想在参数本身之前放置-arg
,则应将其命名为arg
,因此它将成为位置参数。
参考:http://docs.python.org/dev/library/argparse.html#name-or-flags
默认情况下,它会将参数转换为字符串。所以if arg:
不起作用。结果与调用if "foo":
。
如果您希望能够在命令行上键入True
或False
,您可能希望将它们保留为字符串并使用if arg == "True"
。 Argparse支持布尔参数,但据我所知他们只支持表单:test.py --arg
结果为arg = true,而只有test.py
会导致arg = false
答案 2 :(得分:1)
感谢varesa让我顺利找到了解决方案:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("arg",
nargs="?",
default="True",
help="I want the usage to be [{True | False}] (defaults to True)")
arg = parser.parse_args().arg
if arg == "True":
arg = True
elif arg == "False":
arg = False
else:
try:
arg = float(arg)
if arg == 0.:
arg = True
else:
arg = False
except:
if len(arg) > 0:
arg = True
else:
arg = False
if arg:
print "argument is true"
else:
print "argument is false"
然而,在我看来相当复杂。我是愚蠢的(我是Python新手)还是可以有更简单,更直接,更优雅的方式来做到这一点?一种接近函数处理它的非常直接的方式,如原始帖子所示。