从命令行传入时是否有一种为变量赋值的pythonic方法?

时间:2014-12-20 11:15:36

标签: python command-line-arguments argparse

我写了以下代码,但感觉非常笨重,我想知道是否有一种pythonic方式编写以下代码:

import argparse

foo = 0
bar = 1

parser = argparse.ArgumentParser()
parser.add_argument("-a", "--foo", type=int,
                    help="foo")
parser.add_argument("-b", "--bar", type=int,
                    help="bar")

args = parser.parse_args()
if args.foo:        # This is the bit that I think is clunky
    foo = args.foo  #
if args.bar:        #
    bar = args.bar  #

在我的代码中,我有大约7个不同的参数,并且列出if语句并不是最好的方法。有没有更好的方式来写这个部分?

2 个答案:

答案 0 :(得分:3)

argparse有默认参数,因此不需要if。此外,您应该分离参数解析和处理,因此您不需要args的局部变量,但可以将它们用作参数。所以你最终会得到这样的东西:

import argparse

def some_function(foo, bar):
    pass

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("-a", "--foo", type=int, default=0,
                        help="foo")
    parser.add_argument("-b", "--bar", type=int, default=1,
                        help="bar")

    args = parser.parse_args()
    some_function(args.foo, args.bar)


if __name__ == '__main__':
    main()

答案 1 :(得分:1)

argsparse中,defaultrequired字段可以帮助您减少if的数量。

示例:

parser = argparse.ArgumentParser()
parser.add_argument("-a", "--foo", type=int, required=True,
                    help="foo")
parser.add_argument("-b", "--bar", type=int, default=42,
                    help="bar")

您还可以返回args对象,并在以后访问args。