在python中使用命令行参数标志的正确方法

时间:2016-01-07 08:38:26

标签: python global-variables command-line-arguments

我有一组(4个标志)的标志,它们控制我的python脚本生成的输出的性质,以及控制脚本打印到终端的信息量的标志(verbose标志通常的方式)。这些标志由多个函数使用。标志的值由可选的命令行参数设置,我使用argparse解析。

目前,我在全局范围内使用这些标志在任何使用标志的函数之外,而不是将标志作为参数传递给函数。像这样:

import argparse
flag1=True
flag2=True
flag3=True

def fun1():
    ...
    if flag1:
        ..something..
    else: 
        ..something else..
    #fun1 also uses the other flags in a similar way
    ...

def fun2():
    ...
    if flag2:
        ..something..
    else: 
        ..something else..
    #fun1 also uses the other flags in a similar way
    ...

def main()
    ...
    args=parser.parse_args()
    ...
    global flag1
    flag1=args.flag1
    # and so on for the other flags 
    fun1()
    fun2()

我一直认为,从python中的许多答案(例如this)中使用全局变量是不好的做法。这也适用于此吗?我有点不愿意将标志作为参数传递,因为我将传递太多变量作为参数。

处理命令行参数设置的标志的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

最简单的解决方案是将所有标志传递给所有函数(作为单个args对象),或者仅根据哪个函数使用哪个标志传递相关标志。

现在这确实会成为一个负担,特别是对于嵌套函数调用,你很快就会把整个标志从函数传递给函数到函数......这里的解决方法是使用一个类让你可以分享方法之间的状态:

class Command(object):
    def __init__(self, flags):
        self.flags = flags

    def fun1(self):
        ...
        if self.flags.flag1:
            ..something..
        else: 
            ..something else..

    def fun2(self):
        ...
        if self.flags.flag2:
            ..something..
        else: 
            ..something else..


    def run(self):
        self.fun1()
        self.fun2()     

def main()
    ...
    args=parser.parse_args()
    cmd = Command(args)
    cmd.run()

答案 1 :(得分:0)

我还是初学者,但关键字参数对我来说似乎是一个很好的解决方案。我使用这样的东西:

def foo(**kwargs):
    verbose = kwargs.get('verbose', 0)  # set default value for your options
    if verbose > 2:
       print >> sys.stderr, 'some debug message or sth like that'
    if verbose > 0:
       print 'verbose note'  # for sth like 'your_app -v'

if __name__=='__main__'
    args=parser.parse_args()
    verbose = args.flag1
    foo(verbose=verbose)
    foo()