[英]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编写了一个很好的示例。 整个逻辑在这里要花很长时间,但是主要的想法是:
parser = argparse.ArgumentParser(...)
创建解析器 subparsers = parser.add_subparsers(...)
创建子subparsers = parser.add_subparsers(...)
mycmd_fn
将args
作为参数,在该参数中,您可以对命令发出所有开关! 与您要求的不同之处在于,每个命令将需要一个函数,而不是将positional
参数作为第一个参数的一个函数。 但是您可以通过使mycmd_fn像这样轻松地利用它: mycmd_fn = lambda *args: myfunction('mycmd', *args)
HTH
从文档中:
type =可以接受带有单个字符串参数并返回转换后值的任何可调用项:
像int
和float
这样的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.