gpt4 book ai didi

python - 如何处理与 argparse 相关的命令行参数?

转载 作者:太空宇宙 更新时间:2023-11-04 09:55:07 25 4
gpt4 key购买 nike

假设我有一个名为 myprog 的程序,它将一些文件名作为输入,并且我还想使用命令行参数为每个文件设置打开模式。例如

myprog --input a.txt --mode r --input b.txt --input c.txt --mode a

这意味着打开文件 a.txt 模式为 r,文件 b.txt 没有 --mode arg,所以使用默认模式r打开它,对于文件c.txt,使用a模式打开它。

最佳答案

这是一个棘手的问题,因为 argparse 无法让您知道哪个 --input一个特别的--mode与....关联。您可以更改命令的结构,以便文件名和模式由标记字符分隔:

myprog --input a.txt:r --input b.txt --input c.txt:a

显然,这假设您没有名称以 :<mode> 结尾的文件其中 <mode>是任何可接受的文件模式。如果这是一个 OK 结构,那么这就像编写自定义操作或类型来解析字符串并返回合适的对象一样简单。例如

def parse_fstr(s):
filename, _, mode = s.rpartition(':')
return (filename, mode or 'r')

其他解决方案可能涉及使用 nargs='*'然后解析出传递的参数列表。


最后,要轻松实现您实际的要求,我们需要做一个假设。假设是 argparse将从左到右解析项目。考虑到库的功能,据我所知,这是实现的唯一合理选择...

鉴于该实现,我们可以使用自定义类型和自定义 Action 来做到这一点.该类型只是一个结构,用于保存 filename。和一个 mode组合在一起。我们将使用 argparse每次我们点击 --input 时构造一个这种类型的新实例并将其附加到列表中(这由 argparse 开箱即用地支持)。接下来,我们将编写一个自定义操作来更新 mode每次我们遇到 --mode 时列表中的最后一个“文件结构”争论。

import argparse


class FileInfo(object):
def __init__(self, name, mode='r'):
self.name = name
self.mode = mode

def __repr__(self):
return 'FileInfo(name={!r}, mode={!r})'.format(self.name, self.mode)


class UpdateMode(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
try:
last_file_info = namespace.input[-1]
except IndexError:
# No file-info added yet. Error.
parser.error('{} must come after an --input'.format(option_string or '--mode'))

last_file_info.mode = values


parser = argparse.ArgumentParser()
parser.add_argument('--input', action='append', type=FileInfo)
parser.add_argument('--mode', action=UpdateMode)
print(parser.parse_args())

我选择在 --mode 时抛出错误出现在任何 --input 之前, 但如果 2 --mode关注 --input , 我只是覆盖以前的值。如果您想进行更多错误检查,只需在 FileInfo 中编写更多代码即可。类以确保在您更新模式时没有设置任何模式。

关于python - 如何处理与 argparse 相关的命令行参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46231098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com