我有一组(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)中使用全局变量是不好的做法。这也适用于此吗?我有点不愿意将标志作为参数传递,因为我将传递太多变量作为参数。
处理命令行参数设置的标志的最佳方法是什么?
答案 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()