使用不需要指定输出文件名的可选参数运行 argparse

如何解决使用不需要指定输出文件名的可选参数运行 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


不过,更好的是单个必需的位置参数必须采用值 jsonbibtexhtml。然后 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?