繁体   English   中英

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

[英]python argparse: how to use other parsed argument as parameter at calling function in type keyword?

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

其中一个参数需要转换,因此我使用type关键字:

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

还有另一个可选参数:

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

另外,我有

parsed_argument=parse_args()

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

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

我该如何实现?

简单答案:不能。 参数是单独解析的,并不能真正保证维持某些顺序。 无需将逻辑放入参数类型,只需将其存储为字符串,然后在解析命令行后执行操作即可:

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

args = parser.parse_args()

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

我不确定我是否正确理解您要实现的目标,但是如果您要完成的目标是:

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

是的,您可以,您需要使用子解析器。 我为通过POI访问stackoverflow的API编写的一些PoC编写了一个很好的示例。 整个逻辑在这里要花很长时间,但是主要的想法是:

  1. 使用parser = argparse.ArgumentParser(...)创建解析器
  2. 使用subparsers = parser.add_subparsers(...)创建子subparsers = parser.add_subparsers(...)
  3. 添加带有诸如subparser.add_parser('mycommand',help ='Its only a command')之类的命令。set_defaults(func = mycmd_fn)其中
  4. mycmd_fnargs作为参数,在该参数中,您可以对命令发出所有开关!

与您要求的不同之处在于,每个命令将需要一个函数,而不是将positional参数作为第一个参数的一个函数。 但是您可以通过使mycmd_fn像这样轻松地利用它: mycmd_fn = lambda *args: myfunction('mycmd', *args)

HTH

从文档中:

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

intfloat这样的Python函数就是类型函数的一个很好的例子。 int接受一个字符串并返回一个数字。 如果无法转换字符串,则会引发ValueError 您的功能可以执行相同的操作。 argparse.ArgumentTypeError是另一个选项。 argparse不会将任何可选参数传递给它。 查看argparse.FileType的代码,以查看自定义type详细示例。

action是您可以自定义行为的另一个地方。 该文档提供了一个自定义操作的示例。 它的参数包括namespace ,解析器将在其中收集它将返回给您的值的对象。 该对象包含任何已设置的参数。 理论上,您的switch值将在那里可用-如果它首先出现。

有许多SO答案可提供自定义Actions

子解析器是自定义参数处理的另一种好方法。

通常,最好检查parse_args之后参数的交互。 在您的情况下,“切换”可能会在位置之后发生,并且仍然有效。 argparse.Error允许您使用argparse错误机制(例如,显示用法)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM