<p>看到选项时不要调用<code>foo</code>和<code>var</code>。相反,在解析所有选项后,收集要执行的操作列表</p>
<p>差不多</p>
<pre><code>import argparse
import logging
def foo(x):
pass
def bar(x):
pass
def SetVerbosity(value):
class Action(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
logging.getLogger(values).setLevel(level=value)
return Action
class PerformFoo(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
namespace.to_do += [(foo, values)]
class PerformBar(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
namespace.to_do += [(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')
args = parser.parse_args()
for f, v in args.to_do:
f(v)
</code></pre>