【问题标题】:Correct way to use command line argument flags in python在 python 中使用命令行参数标志的正确方法
【发布时间】:2016-01-07 17:43:28
【问题描述】:

我有一组(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()

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

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

【问题讨论】:

  • 你可以做 def fun1(args)
  • 您可以简单地将 args 作为参数传递,并且只需一个即可。
  • 谢谢!会这样做!早该想到的。
  • 但话又说回来,我也想知道并非针对这种特殊情况的其他解决方案。

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


【解决方案1】:

最简单的解决方案是将所有标志传递给所有函数(作为单个 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()

【讨论】:

    【解决方案2】:

    我仍然是初学者,但关键字参数对我来说似乎是解决您的问题的好方法。我使用这样的东西:

    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()
    

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 1970-01-01
      • 2012-01-05
      • 2020-08-17
      • 2011-06-30
      • 2023-04-03
      • 2020-09-21
      相关资源
      最近更新 更多