如何解决argparse:位置参数之间的可选参数
我想模拟大多数命令行实用程序的行为,可以在命令行中的任意位置放置可选参数,包括 之间的位置参数,例如本mkdir
示例:
mkdir before --mode 077 after
在这种情况下,我们知道--mode
正好接受1个参数,因此before
和after
都被视为位置参数。可以将可选部分--mode 077
放在命令行的任意位置。
但是,对于argparse
,以下代码不适用于该示例:
# mkdir.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--mode',nargs=1)
parser.add_argument('dirs',nargs='*')
args = parser.parse_args()
运行./mkdir.py before --mode 077 after
会导致:
mkdir.py: error: unrecognized arguments: after
如何让argparse
接受位置参数之间的可选参数(具有已知的固定数量的参数)?
解决方法
从Python 3.7开始,看来argparse
现在支持这种Unix风格的解析:
混合解析
ArgumentParser.parse_intermixed_args(args=None,namespace=None)
许多Unix命令允许用户将可选参数与位置参数混合在一起。
parse_intermixed_args()
和parse_known_intermixed_args()
方法支持这种解析样式。
有一个警告,但是对于“简单”选项,它不会影响它们:
这些解析器不支持所有的argparse功能,如果使用了不受支持的功能,则会引发异常。特别是,不支持子解析器
argparse.REMAINDER
以及同时包含可选和位置的互斥组。
(我花了1个小时试图理解为什么Python argparse
文档中的示例似乎没有包含该示例,但我偶然发现了一个不相关的问题,在注释中包含对该“混合”函数的提及,我无法再次找到对其进行正确引用。)
我对argparse不熟悉,所以我会编写自己的代码来处理参数。
import sys
#the first argument is the name of the program,so we skip that
args = sys.argv[1:]
#just for debugging purposes:
argsLen = len(args)
print(args,argsLen)
#Create a list that will contain all of the indeces that you will have parsed through
completedIndeces = []
i = 0
#add the index to the completed indeces list.
def goToNextIndex(j):
global i
completedIndeces.append(j)
i += 1
def main():
global i
###core logic example
#Go through each item in args and decide what to do based on the arugments passed in
for argu in args:
if i in completedIndeces:
print("breaking out")
#increment i and break out of the current loop
i += 1
# If the indeces list has the index value then nothing else is done.
pass
elif argu == "joe":
print("did work with joe")
goToNextIndex(i)
elif argu == "sam":
print("did work with sam")
goToNextIndex(i)
elif argu == "school":
print("going to school")
goToNextIndex(i)
# If the argument has other arguments after it that are associated with it
# then add those indeces also to the completed indeces list.
#take in the argument following school
nextArg = i
#Do some work with the next argument
schoolName = args[nextArg]
print(f"You're going to the school called {schoolName}")
#make sure to skip the next argument as it has already been handled
completedIndeces.append(nextArg)
else:
print(f"Error the following argument is invalid: {argu}")
goToNextIndex(i)
print(f"Value of i: {i}")
print(f"completed indeces List: {completedIndeces}")
main()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。