gpt4 book ai didi

python - 有没有办法接受参数选择作为单个字符串

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

我想为给定的参数处理一串选择,而不是多次指定参数或使用空格。

我有一个显示视频文件元数据的脚本。大多数时候我只需要文件列表,但偶尔我需要查看文件的持续时间、大小、比特率等。

最初我对每个元数据都有一个论点。 -l 表示长度或持续时间,-d 表示创建日期,-m 表示修改日期,-b 表示比特率,-r 表示分辨率,-c 表示音频 channel ,-s 大小,-e 表示一切,等等...我可以指定一些或全部或不指定并准确获取我想要的信息,但参数列表开始变得非常不守规矩,并且当我添加元数据以显示和其他功能时,我开始用完逻辑字母分配并不得不开始交换参数名称我想要一个更好的方法。

我希望简化元数据的表达,并考虑将一些论点合并为一个,并减少最终命令的长度和涉及的输入。

具体来说,我正在尝试将其变为:

script.py -d -t -l -s -b -r -f -c -v -a

进入这个:

script.py -m dtlsbrfcva

这是我当前的功能:

def get_arguments():
parser = argparse.ArgumentParser(description=DESCRIPTION)
parser.add_argument('-m', action='append', nargs='+', choices=['d','t','l','s','b','r','f','c','v','a','e'],help='Display metadata for each file. Choices: (d)ate, (t)ime, (l)ength, (s)ize, (b)itrate, (r)esolution, (f)ramerate, (c)hannels, (v)ideo codec, (a)spect ratio, (e)verything')
parser.add_argument('files', nargs='*')
args = parser.parse_args()

if len(args.files) == 0:
args.files="."

return args

使用 choices 似乎是解决此问题的方法,但是当我对操作使用“append”并为 nargs 使用“+”时,我要么需要重新指定参数

script.py -md -mt -ml -ms -mb -mr -mf -mc -mv -ma

哪个更糟...或者使用空格

script.py -m d t l s b r f c v a

我猜哪个更好一些?

但我确实得到了信息帮助:

 -m {d,t,l,s,b,r,f,c,v,a,e} [{d,t,l,s,b,r,f,c,v,a,e} ...]
Display metadata for each file. Choices:
(d)ate, (t)ime, (l)ength, (s)ize, (b)itrate,
(r)esolution, (f)ramerate, (c)hannels, (v)ideo codec,
(a)spect ratio, (e)verything

现在要清楚,如果我使用

add_argument('-m', action="store", help='Display metadata for each file. Choices: (d)ate, (t)ime, (l)ength, (s)ize, (b)itrate, (r)esolution, (f)ramerate, (c)hannels, (v)ideo codec, (a)spect ratio, (e)verything')

相反,我可以获得一个可以拆分并自己处理的字符串,但这种方式的帮助不大...

 -m M          Display metadata for each file. Choices: (d)ate, (t)ime,
(l)ength, (s)ize, (b)itrate, (r)esolution, (f)ramerate,
(c)hannels, (v)ideo codec, (a)spect ratio, (e)verything

我也研究了子解析器,但从我所做的阅读来看,我只会将我的问题扩展到不同的代码层,并使我的帮助输出变得不那么有用。我很乐意在这方面进行纠正。

理想情况下,我希望坚持使用 argparse 选择以获得编程优势,包括不正确选项的错误和格式良好的帮助,但我对其他方法持开放态度。非常感谢任何指导。

最佳答案

这将接受 -m 可能后跟一个由对应于选项的字母组成的字符串。

import argparse

MCHOICES = 'dtlsbrfcvae'
def msplit(marg):
mlist = list(marg)
for ch in mlist:
if ch not in MCHOICES:
raise argparse.ArgumentTypeError(f"{ch} is not a valid choice")
return mlist


parser = argparse.ArgumentParser(description="<put description here>")
parser.add_argument('-m', type=msplit, nargs='?', const=[], default=[], help='Display metadata for each file...')

# some examples:
args = parser.parse_args("-m dtlsv".split())
print(args)
args = parser.parse_args("-m".split()) # const=... is used in this case (bare -m)
print(args)
args = parser.parse_args("".split()) # default=... is used in this case (no -m at all)
print(args)

更新:

设置默认值时,字符串会被当作参数来处理。非字符串直接赋值,不经过mlist处理。例如。要使“-me”成为默认元数据选择,请使用 default='e'default=['e'](和 const=... )。 (感谢@hpaulj 的评论)


此替代方案使带有选项的字符串成为强制性的:

parser.add_argument('-m', type=msplit, default=[], help='Display metadata for each file...')

关于python - 有没有办法接受参数选择作为单个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57447655/

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