我正在编写一个带有 argparse 的工具,它将从命令行获取源目录列表并处理其中的所有文件。最终,当调用 parse_args 时,会扫描每个目录以查找要处理的文件,并将文件列表放入files
返回的命名空间之外的属性中。
parser = argparse.ArgumentParser()
parser.add_argument('-s', '--sources'
, dest = 'files'
, default = 'results/e1653a3'
, nargs = '*'
, metavar = 'SOURCE'
, action = ConcatAction
, type = FileList
)
args = parser.parse_args()
在这里,该FileList
函数采用目录名称并返回文件列表。ConcatAction
是一个扁平化列表列表的动作。结果是我可以将我的工具称为tool.py -s dir1 dir2
,并args.files
包含两个目录中的所有文件。
默认情况下,我希望它扫描多个目录;但是,将列表传递给默认值:
, default = ['dir1', 'dir2']
回避了 argparse 的类型转换系统,因此FileList()
永远不会被调用,并且args.files
包含 list ['dir1', 'dir2']
,而不是扫描的文件。如果我尝试
, default = 'dir1 dir2'
然后进行一次调用FileList('dir1 dir2')
而不是两次调用FileList('dir1')
FileList('dir2')
我知道我可以只处理 argparse 之外的源目录以获得我想要的功能,但是无论如何让 argparse 对默认值列表执行类型转换?