2014-11-06 86 views
2

以这种方式获取命令行参数是否有内在的错误?我的意思是把参数解析放到它自己的函数中。它会被认为是非Pythonic或更多?作为函数的Python argparse

#!/usr/bin/python 

import argparse 

def getArgs(argv=None): 
    parser = argparse.ArgumentParser(description="calculate X to the power of Y") 
    group = parser.add_mutually_exclusive_group() 
    group.add_argument("-v", "--verbose", action="store_true") 
    group.add_argument("-q", "--quiet", action="store_true") 
    parser.add_argument("x", type=int, help="the base") 
    parser.add_argument("y", type=int, help="the exponent") 
    return parser.parse_args(argv) 

if __name__ == "__main__": 

    argvals = None    # init argv in case not testing 
    argvals = '6 2 -v'.split() # example of passing test params to parser 
    args = getArgs(argvals) 

    answer = args.x**args.y 

    if args.quiet: 
     print answer 
    elif args.verbose: 
     print "{} to the power {} equals {}".format(args.x, args.y, answer) 
    else: 
     print "{}^{} == {}".format(args.x, args.y, answer) 
+0

不,这很好。 – 2014-11-06 17:45:27

+0

您可以使用单个选项来详细说明,但由于您有3个级别,因此可能不会更容易理解。 – 2014-11-06 18:01:34

+0

@ivan_pozdeev - 感谢您对冗长的反馈。基本示例来自https://docs.python.org/2/howto/argparse.html#conflicting-options。真的在询问将argparse块放入函数中,而不是“裸”。在我看来,我的例子是Pythonic更多,但我找不到任何其他人的例子。因此我的问题。 – JonB 2014-11-06 18:21:19

回答

3

它看起来不错,感觉很好,符合Python Zen - 那么,有什么问题,如果你没有看到这个特殊的代码这样呢?

把一个有点独立的功能移到子程序中是非常好的做法 - 准确地说是separation of concerns的体现。这甚至不关于Python。

+0

接受这个答案,因为它证实了哲学。谢谢,@ivan_pozdeev! – JonB 2014-11-07 12:20:34

5

这很好。我唯一的建议是允许get_args作为参数(默认为None)传递给parse_args()的参数列表。这使得测试更容易。此外,import声明仍应位于脚本的顶部,而不是get_args本身。

import argparse 

# ... 

def get_args(argv=None): 
    parser = argparse.ArgumentParser(description="calculate X to the power of Y") 
    # ... 
    return parser.parse_args(argv) 
+0

更新了我的代码以反映这一点。谢谢! – JonB 2014-11-07 12:19:15