我正在编写一个带有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
包含列表['dir1', 'dir2']
,而不包含扫描的文件。如果我试试
, default = 'dir1 dir2'
然后拨打FileList('dir1 dir2')
一次,而不是两次通话FileList('dir1')
FileList('dir2')
我知道我可以只处理argparse之外的源目录来获取我想要的功能,但是无论如何让argparse在默认值列表上执行类型转换?
答案 0 :(得分:2)
如您所知,字符串默认值通过type函数传递,而所有其他默认值都只是分配给属性(未更改)。我认为解决方案是在默认情况下构建您希望在命名空间中看到的确切文件列表。
parser.add_argument('-s', '--sources'
, dest = 'files'
, default = [FileList('dir1'), FileList('dir2')] # exact file list
, nargs = '*'
, metavar = 'SOURCE'
, action = ConcatAction
, type = FileList
)
我会让你担心应用那种展平行动。
或者您可以使用所需的文件列表初始化命名空间。在这种情况下,default
将被忽略。
ns = argparse.NameSpace(files = [FileList('dir1'), FileList('dir2')])
# or
ns = argparse.NameSpace(files = ['dir1/file1','dir1/file2','dir2/file1',...])
parser.parse_args(sys.argv, namespace=ns)