<p>如果有人好奇的话,下面是我(可能)不必要的复杂实现。你知道吗</p>
<p>就行为而言,我的选项列表位于dict中,因此我可以添加或删除项,而无需修改任何argparse代码或帮助字符串。它为帮助信息构建必要的字符串,并从dict生成一个要比较的列表</p>
<p>然后,它将输入字符串与可用选项列表进行比较,并构建一个新的列表,以根据特定规则迭代并执行相应的函数。你知道吗</p>
<p>-m假定-me变成-mdtlsbrfcvae并转换为列表。<br/>
不管给出了什么,如果字符串中根本没有“e”,请将list设置为等于所有元数据选项。你知道吗</p>
<p>对-m进行适当的语法分析,必要时给出错误。你知道吗</p>
<pre><code>metadata_options={'d':'date',
't':'time',
'l':'length',
's':'size',
'b':'bitrate',
'r':'resolution',
'f':'framerate',
'c':'channels',
'v':'video codec',
'a':'aspect ratio',
'e':'everything'}
def metadata_option_extractor():
metadata_choices=[]
metadata_options_string=''
punct=''
last=len(metadata_options)
count=0
for choice,description in metadata_options.items():
metadata_choices.append(choice)
word=list(description)
word.insert(0, '(')
word.insert(2, ')')
description = "".join(word)
count += 1
if count < last:
punct=','
else:
punct='.'
metadata_options_string += description + punct + ' '
return metadata_choices,metadata_options_string
metadata_choices,metadata_options_string=metadata_option_extractor()
def msplit(mlist):
new_mlist=[]
for ch in mlist:
if ch not in metadata_choices:
raise argparse.ArgumentTypeError(f"invalid choice: '{ch}' in '{mlist}' (choose from "+str(metadata_choices)+")")
else:
new_mlist.append(ch)
if 'e' in new_mlist:
new_mlist = metadata_choices
return new_mlist
def get_arguments():
parser = argparse.ArgumentParser(description=DESCRIPTION)
parser.add_argument('-g', action='store', default='d', nargs=1, choices=['d', 'l', 't', 'b'], help='Group by various criteria. (d)ate, (t)ime, (l)ength, (b)itrate. Default: Date')
parser.add_argument('-m', type=msplit, nargs='?', const='e', help='Display metadata for each file. When given without any options it is taken to mean all options. Choices: '+metadata_options_string)
parser.add_argument('-n', nargs='*', action='store', help='Go back only n many groups (typically days). A second argument may be added to limit the number of grouped results.', type=int)
parser.add_argument('-r', action='store_true', help='Recurse subdirectories.')
parser.add_argument('-s', action='store', help='Search for "Word(s)", separated by commas, in filenames.', type=str)
parser.add_argument('-a', action='store_true', help='Switch search method from OR to AND. Requires -s')
parser.add_argument('-x', action='store_true', help='Export filenames in quotes as a single line for use with another program.')
parser.add_argument('-c', action='store_true', help='Count number of videos by group rather than list the videos.')
parser.add_argument('files', nargs='*')
args = parser.parse_args()
# Default behaviour
if len(args.files) == 0:
args.files="."
return args
</code></pre>