3

如果用户不知道 c 并且 a = 3 和 b = 2 我想这样调用程序:

$ python my_program 3 2

如果用户知道 c 并且 c = 9 我想这样调用程序:

$ python my_program -c 6

由于由 表示的计算c = results.a + results.b大约需要 30 分钟才能完成,如果 c 已知,我希望能够跳过它。

这可能吗?我在下面有两个不同的代码示例,但这并不是我想要的。

代码示例 1

import argparse

def my_function():

    if results.c == 0:
        c = results.a + results.b
        d = c + 5

    else:
        d = results.c + 5


if __name__=='__main__':

    parser = argparse.ArgumentParser()

    parser.add_argument('a', action="store", type=int)
    parser.add_argument('b', action="store", type=int)
    parser.add_argument('-c', action="store", default=0, type=int)

    results = parser.parse_args()

    my_function()

我的代码示例 1 所需的调用是:

$ python my_program 3 2

或者

$ python my_program 3 2 -c 6

代码示例 2

import argparse

def my_function():

    if results.c == 0:
        c = results.a + results.b
        d = c + 5

    else:
        d = results.c + 5


if __name__=='__main__':

    parser = argparse.ArgumentParser()

    parser.add_argument('-a', action="store", default=0, type=int)
    parser.add_argument('-b', action="store", default=0, type=int)
    parser.add_argument('-c', action="store", default=0, type=int)

    results = parser.parse_args()

    my_function()

我的代码示例 2 所需的调用是:

$ python my_program -a 3 -b 2

或者

$ python my_program -c 6

感谢您的任何帮助。祝你有美好的一天。

4

1 回答 1

3

您必须将所有参数设为可选并自己验证它们:

ap=argparse.ArgumentParser()

ap.add_argument('-c', required=False)
ap.add_argument('a', nargs='?')
ap.add_argument('b', nargs='?')

args = ap.parse_args()

if (args.c is not None):
    # process c
elif (args.a is not None and args.b is not None):
    # process a and b
else:
    # validation errors

如果您愿意使用单个命名参数而不是位置参数,则可以使用a互斥为您执行此操作。互斥组要求其中的所有参数都是可选的,命名参数只能是必需的。b

ap=argparse.ArgumentParser()

g = ap.add_mutually_exclusive_group(required=True)
g.add_argument('-ab', nargs=2, required=False)
g.add_argument('-c', required=False)

args = ap.parse_args()

print('args={}'.format(repr(args)))

if (args.c is not None):
    # process c
elif (args.ab is not None):
    a, b = args.ab
    # process a and b
else:
    raise Exception("should never get here")
于 2013-06-08T14:33:43.897 回答