gpt4 book ai didi

Python 参数解析 : type conversion of a list of default arguments

转载 作者:行者123 更新时间:2023-11-28 17:45:02 25 4
gpt4 key购买 nike

我正在编写一个带有 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 dir2args.files 包含两个目录中的所有文件。

默认情况下,我希望它扫描多个目录;但是,将列表传递给默认值:

, default = ['dir1', 'dir2']

回避 argparse 的类型转换系统,因此永远不会调用 FileList(),并且 args.files 包含列表 ['dir1', 'dir2 '],而不是扫描的文件。如果我尝试

, default = 'dir1 dir2'

然后调用 FileList('dir1 dir2') 而不是两次调用 FileList('dir1') FileList('dir2' )

我知道我可以只处理 argparse 之外的源目录以获得我想要的功能,但是无论如何可以让 argparse 对默认值列表执行类型转换吗?

最佳答案

正如您所注意到的,字符串默认值通过类型函数传递,而所有其他默认值只是分配给属性(未更改)。我认为解决方案是在默认情况下构建您希望在命名空间中看到的确切文件列表。

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)

关于Python 参数解析 : type conversion of a list of default arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19757063/

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