如何解决使用不需要指定输出文件名的可选参数运行 argparse
我已经阅读了一堆已经回答过的问题,但我没有看到这些内容——至少我没有意识到。
我正在使用 argparse 来获取文件并将其转换为不同的类型。输入文件名是必需的。输出文件名不是必需的,因为可选参数应该处理它。这是到目前为止的代码:
import sys
import argparse
parser = argparse.ArgumentParser(description='Convert file to new type')
parser.add_argument('--json',type=str,help='Converts to json format')
parser.add_argument('--bibtex',help='Converts to bibtex format')
parser.add_argument('--html',help='Converts to html format')
parser.add_argument('inputfilename',help='enter the original filename')
args = parser.parse_args()
filename=args.filename
if args.json:
print('Converting to json ...')
#conversion code here
elif args.bibtex:
print('Converting to bibtex ...')
#conversion code here
elif args.html:
print('Converting to html ...')
#conversion code here
else:
print('No conversion type indicated')
问题是,每当我使用这些标志之一。如果我这样做
$ ./orsconvert.py --json inputfilename
我收到一条错误消息
orsconvert.py: error: the following arguments are required: inputfilename
这样做是因为它将提供的 inputfilename
解释为连接到 --json
的输出文件名。它试图强迫我在可选参数之后和输入文件名之前实际声明输出文件名,类似于:
$ ./orsconvert.py --json outputfilename inputfileneame
但是,如果有办法解决的话,我不想这样做。我希望它接受 --json
作为要做什么的指示,然后使用 inputfilename
作为输入并根据代码将指定的内容自动将其保存为 outputfilename
。
是的,我正在考虑将 3 个可选参数作为一组来简化代码......但这仍然没有解释如何让它在可选参数之后和最终 {{1 }} 必需参数。
还有什么我可以在 inputfilename
字段中添加的内容,从而不再要求我指定 parser.add_argument('...')
?我想尽可能少地更改代码,因为我已经在挑战我的编码理解能力。
解决方法
问题在于您定义了 --json
来要求一个参数,并且它将输入文件名作为该参数。您的三个转换器应使用 store_true
操作,而不是默认的 store
操作。
parser = argparse.ArgumentParser(description='Convert file to new type')
parser.add_argument('--json',action='store_true',help='Converts to json format')
parser.add_argument('--bibtex',help='Converts to bibtex format')
parser.add_argument('--html',help='Converts to html format')
parser.add_argument('inputfilename',help='enter the original filename')
args = parser.parse_args()
通过此更改,args.json
等都是您期望的布尔值。 store_true
操作负责将类型定义为 bool
,将默认值定义为 false
。
不过,更好的是单个必需的位置参数必须采用值 json
、bibtex
或 html
。然后 parse_args
本身会检测是否提供了不正确或缺失的转化类型。
parser = argparse.ArgumentParser(description='Convert file to new type')
parser.add_argument('inputfilename',help='enter the original filename')
parser.add_argument('conversion_type',choices=['json','bibtex','html'])
args = parser.parse_args()
filename = args.filename
conversion_type = args.conversion_type # Guaranteed to be json,html,or bibtex
if conversion_type == "json":
...
elif conversion_type == "bibtex":
...
elif conversion_type == "html":
如果你想要一个带有 default 值的选项,请扣好 :) 我们将添加 4 个选项:一个可以明确指定输出类型的选项,以及三个设置快捷键。
p = argparse.ArgumentParser()
p.add_argument('inputfilename')
p.add_argument('--type','html'],default='json')
p.add_argument('--json',action='store_const',const='json',dest='type')
p.add_argument('--html',const='html',dest='type')
p.add_argument('--bibtex',const='bibtex',dest='type')
--json
、--bibtex
和 --html
分别与 --type json
、--type bibtex
和 --type html
具有相同的效果。和以前一样,--type
只能将这三个值作为参数。如果超过其中一项,则最后使用的一项生效。
argparse
已经提供了您实际拥有所需 API 所需的一切,而不是您认为需要的 API。
- 类型应该是多个
choices
之一,而不是三个单独的标志。 - 应该需要
inputfilename
。 -
outputfilename
应该是可选的。
import argparse
parser = argparse.ArgumentParser(description='Convert file to new type')
parser.add_argument('format',choices=["json","bibtex","html"])
parser.add_argument('inputfilename',type=str)
parser.add_argument('outputfilename',type=str,nargs="?")
args = parser.parse_args()
print(args)
这会自动提供所需的用法,不会误用可选项,而是获得错误处理。
$ ./converter json in.txt
Namespace(format='json',inputfilename='in.txt',outputfilename=None)
$ ./converter html in.txt out.html
Namespace(format='html',outputfilename='out.html')
$ ./converter yaml in.txt
usage: converter [-h] {json,bibtex,html} inputfilename [outputfilename]
converter: error: argument format: invalid choice: 'yaml' (choose from 'json','html')
,
您的问题是 argparse 需要输入,尤其是因为您有 #Another way of solving
class Node:
def __init__(self,key):
self.key = key
self.next = None
def printList(head):
curr = head
while curr != None:
print(curr.key,end=" ")
curr = curr.next
def deleteLastNode(head):
if head == None:
return None
temp = head
prev=None #creating the value of previous element
# Iterating till the last Node
while temp.next != None:
prev=temp #updating for every iteration
temp = temp.next
prev.next = None #returning as NONE value
return head
# Driver code
head = Node(10)
head.next = Node(20)
head.next.next = Node(30)
head = deleteLastNode(head)
printList(head)
尝试用这个替换 json arg
type=str
,
所以问题似乎好像每个 argparse.arg 都需要指定一个参数,无论是什么。所以你可以将它设置为一个布尔值。但我认为这种方法可能会更好:
import sys
import argparse
parser = argparse.ArgumentParser(description='Convert file to new type')
parser.add_argument('--type',help='Converts to any of the following formats: 1 for json,2 for bibtex and 3 for html')
parser.add_argument('--inputfilename',help='enter the original filename')
args = parser.parse_args()
filename=args.inputfilename
if args.type:
conversion_type = int(args.type)
if conversion_type == int(1):
print('Converting to json ...')
#conversion code here
elif conversion_type == 2:
print('Converting to bibtex ...')
#conversion code here
elif conversion_type == 3:
print('Converting to html ...')
#conversion code here
else:
print('No conversion type indicated')
只需添加一个参数来指定类型。在此基础上,根据条件进行转换或不转换。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。