我正在运行Python 3.6.8 :: Anaconda自定义(64位),并且从argparse获得了奇怪的结果。尽管带有-x,但trainandexecute = False的值
def get_parameters():
startup = '-x -b'
sys.argv = startup.split(' ')
ap = argparse.ArgumentParser()
ap.add_argument('-x', '--trainandexecute', action='store_true')
ap.add_argument('-b', '--debug', action='store_true')
ap.add_argument('-d', '--rundate', action='store')
print(ap.parse_args())
return vars(ap.parse_args())
get_parameters()
这将返回以下输出。请注意,尽管带有-x标志,trainandexecute = False。
Namespace(debug=True, execute=False, train=False, trainandexecute=False)
{'train': False,
'execute': False,
'trainandexecute': False,
'debug': True}
但是,此测试可在下一个Jupyter单元中使用,并且它不是我的环境:
def get_test_parameters():
startup = '-b -x'
sys.argv = startup.split(' ')
print(sys.argv)
ap = argparse.ArgumentParser()
ap.add_argument('-x', '--x', action='store_true')
ap.add_argument('-b', '--debug', action='store_true')
print(ap.parse_args())
return vars(ap.parse_args())
所以输出:
get_test_parameters()
是:
['-b', '-x'] # print(sys.argv)
Namespace(debug=False, x=True) # print(ap.parse_args())
{'x': True, 'debug': False} # return vars(ap.parse_args())
我被刺伤了...
答案 0 :(得分:3)
您的错误在这一行:
sys.argv = startup.split(' ')
sys.argv
中的第一个值被视为脚本的名称,而不是选项。尝试运行ap.parse_args(startup.split())
-您会看到正确的答案。
顺便说一句,不要将任何参数传递给split()
。如果您通过" "
并且连续空格超过一个,则分割结果将为空字符串。
答案 1 :(得分:1)
这是一个更好的测试框架:
Jr.
您可以改为修改/([A-Za-z ',-]+\.?)/
。通过在函数中传递def get_parameters(argv=None):
ap = argparse.ArgumentParser()
ap.add_argument('-x', '--trainandexecute', action='store_true')
ap.add_argument('-b', '--debug', action='store_true')
ap.add_argument('-d', '--rundate', action='store')
args = ap.parse_args(argv)) # if None, parses sys.argv[1:]
print(args)
return vars(args)
get_parameters('-x -b'.split())
,您可以测试几种方法。