【问题标题】:Python argparse: type conversion of a list of default argumentsPython argparse:默认参数列表的类型转换
【发布时间】:2013-11-04 14:49:20
【问题描述】:

我正在编写一个带有 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 对默认值列表执行类型转换?

【问题讨论】:

    标签: python list default argparse


    【解决方案1】:

    正如您所注意到的,字符串默认值通过 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)
    

    【讨论】:

    • 忘记接受这个。这是我最终采用的解决方案,尽管我不喜欢它调用 FileList 作为默认值,无论它是否使用默认值。我想,对我的使用来说已经足够了。
    猜你喜欢
    • 2017-07-06
    • 2017-10-13
    • 2021-10-16
    • 2017-09-12
    • 2018-03-26
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多