【发布时间】:2021-09-05 06:56:23
【问题描述】:
我有一个 python 应用程序,它有一些可重复的参数,交错顺序很重要。例如app -f 1 -b 2 -f 3 和 app -f 1 -f 3 -b 2 不是同一个命令。
问题是我也有详细控制参数,我希望它影响在操作中执行的代码的日志记录行为。
有没有办法让argparse 乱序处理某些参数,以便在处理其他参数之前应用详细程度控制,而不管它在argv 中的什么位置?
# test.py
import argparse
import logging
def foo(x):
logging.info(f'hi foo {x}')
def bar(x):
logging.debug(f'hi bar {x}')
def SetVerbosity(log_level):
class Action(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
logging.getLogger(values).setLevel(level=log_level)
return Action
class PerformFoo(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
foo(values)
class PerformBar(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
bar(values)
parser = argparse.ArgumentParser()
parser.add_argument('-v', '--verbose', nargs='?', action=SetVerbosity(logging.INFO))
parser.add_argument('-vv', nargs='?', action=SetVerbosity(logging.DEBUG))
parser.add_argument('-f', '--foo', metavar='VAL', action=PerformFoo, help='Do a foo')
parser.add_argument('-b', '--bar', metavar='VAL', action=PerformBar, help='Do a bar')
logging.basicConfig()
parser.parse_args()
# No problem
python test.py -v -f 1 -b 2 -f 3
INFO:root:hi foo 1
INFO:root:hi foo 3
# kind of unfortunate
app -f 1 -b 2 -f 3 -v
*crickets*
作为后备,我知道我可以将-f 和-b 累积到一个异构的“待办事项”列表中,然后在事后处理它们。但是,如果有一种相当简单的方法来解决这个问题,而无需增加间接层,我宁愿不跳过这个额外的环节。
【问题讨论】: