python argparse:如何在类型关键字中调用函数时使用其他解析参数作为参数?

时间:2014-02-01 14:21:13

标签: python argparse

我正在尝试使用argparse模块创建用户界面。

其中一个参数需要转换,所以我使用了type关键字:

add_argument('positional', ..., type=myfunction)

还有另一个可选参数:

add_argument('-s', dest='switch', ...) 

另外,我有

parsed_argument=parse_args()

但是,在myfunction中,我希望我可以使用一个额外的参数来控制行为,这是上面的可选参数,即

def myfunction(positional, switch=parsed_argument.switch): 
     ...

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:1)

简单回答:你做不到。参数被单独解析,并且没有真正保证维持某个订单。而不是将您的逻辑放入参数类型,只需将其存储为字符串并在解析命令行后执行您的操作:

parser.add_argument('positional')
parser.add_argument('-s', '--switch')

args = parser.parse_args()

myfunction(args.positional, switch=args.switch)

答案 1 :(得分:0)

我不确定我是否理解了你想要达到的目标,但如果你想做的事情看起来像是:

myprog.py cmd1 --switcha
myprog.py cmd2 --switchb

是的,你可以,你需要使用subparsers。我为一点PoC I wrote to access stackoverflow's API from CLI写了一个很好的例子。整个逻辑在这里有点长,但主要是这个想法是:

  1. 使用parser = argparse.ArgumentParser(...)
  2. 创建解析器
  3. 使用subparsers = parser.add_subparsers(...)
  4. 创建子分析器
  5. 添加命令,例如`subparser.add_parser('mycommand',help ='它只是一个命令')。set_defaults(func = mycmd_fn)where
  6. mycmd_fnargs作为参数,您可以将所有开关发给命令!
  7. 与您提出的不同之处在于,每个命令需要一个函数,而不是一个以positional参数作为第一个参数的函数。但是,您可以通过让mycmd_fn像:mycmd_fn = lambda *args: myfunction('mycmd', *args)

    轻松地利用它

    HTH

答案 2 :(得分:0)

来自文档:

  

type =可以接受任何带有单个字符串参数的callable并返回转换后的值:

intfloat这样的Python函数就是类型函数应该是的好例子。 int接受一个字符串并返回一个数字。如果它无法转换字符串,则会引发ValueError。你的功能可以做同样的事情。 argparse.ArgumentTypeError是另一种选择。 argparse不会向其传递任何可选参数。查看argparse.FileType的代码,以查看更详细的自定义type示例。

action是您可以自定义行为的另一个地方。该文档有一个自定义Action的示例。它的参数包括namespace,解析器收集它将返回给你的值的对象。该对象包含已设置的任何参数。从理论上讲,如果首先出现switch,那么您的Actions值将可用。

有很多SO答案可以提供自定义parse_args

Subparsers是另一种自定义参数处理的好方法。

通常最好在argparse.Error之后检查参数的交互。在你的情况下,'开关'可能发生在位置后仍然有效。 argparse允许您使用{{1}}错误机制(例如显示用法)