2 回答

TA贡献1828条经验 获得超13个赞
从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 个小时试图理解为什么 Pythonargparse
文档中的示例似乎没有包含它,然后偶然发现了一个有点不相关的问题,其中包含对这个“混合”函数的提及一条评论,我无法再次找到正确引用它的评论。)

TA贡献1775条经验 获得超11个赞
我不熟悉 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()
添加回答
举报