2016-01-07 25 views
2

我有一组标志(4标志),它们控制我的python脚本生成的输出的性质,以及控制脚本向终端输出多少信息的标志(方式一般是verbose标志)。这些标志被多个函数使用。标志的值由可选的命令行参数设置,我使用​​解析。在Python中使用命令行参数标志的正确方法

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

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,例如)。这也适用于这里吗?我有点不情愿将标志作为参数传递,因为我将传递太多变量作为参数。

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

+0

你可以做高清FUN1(参数) – xfx

+0

你可以简单地传递ARGS作为参数,只用一个来完成。 – Srgrn

+0

谢谢!会这样做!应该有这个想法。 – Slothworks

回答

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() 
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() 
相关问题