我正在尝试使用argparse模块创建用户界面。
其中一个参数需要转换,所以我使用了type关键字:
add_argument('positional', ..., type=myfunction)
还有另一个可选参数:
add_argument('-s', dest='switch', ...)
另外,我有
parsed_argument=parse_args()
但是,在myfunction
中,我希望我可以使用一个额外的参数来控制行为,这是上面的可选参数,即
def myfunction(positional, switch=parsed_argument.switch):
...
我怎样才能做到这一点?
答案 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写了一个很好的例子。整个逻辑在这里有点长,但主要是这个想法是:
parser = argparse.ArgumentParser(...)
subparsers = parser.add_subparsers(...)
mycmd_fn
将args
作为参数,您可以将所有开关发给命令!与您提出的不同之处在于,每个命令需要一个函数,而不是一个以positional
参数作为第一个参数的函数。但是,您可以通过让mycmd_fn像:mycmd_fn = lambda *args: myfunction('mycmd', *args)
HTH
答案 2 :(得分:0)
来自文档:
type =可以接受任何带有单个字符串参数的callable并返回转换后的值:
像int
和float
这样的Python函数就是类型函数应该是的好例子。 int
接受一个字符串并返回一个数字。如果它无法转换字符串,则会引发ValueError
。你的功能可以做同样的事情。 argparse.ArgumentTypeError
是另一种选择。 argparse
不会向其传递任何可选参数。查看argparse.FileType
的代码,以查看更详细的自定义type
示例。
action
是您可以自定义行为的另一个地方。该文档有一个自定义Action的示例。它的参数包括namespace
,解析器收集它将返回给你的值的对象。该对象包含已设置的任何参数。从理论上讲,如果首先出现switch
,那么您的Actions
值将可用。
有很多SO答案可以提供自定义parse_args
。
Subparsers是另一种自定义参数处理的好方法。
通常最好在argparse.Error
之后检查参数的交互。在你的情况下,'开关'可能发生在位置后仍然有效。 argparse
允许您使用{{1}}错误机制(例如显示用法)