【发布时间】:2021-07-05 00:02:26
【问题描述】:
我正在编写一组可以解析多种输入格式的 python 脚本,但是这些输入的 type 是由另一个命令行参数决定的。如何让一个参数影响另一个参数的类型?
展示我想要的行为的示例:
import argparse
def load_single_file(filepath: str):
...
def load_directory(filepath: str):
...
parser = argparse.ArgumentParser()
parser.add_argument('--type', choices=('single-file', 'directory'), required=True)
parser.add_argument('input', type=load_single_file if '--type' == 'single-file' else load_directory)
我不想对parser.parse_args() 进行后期处理,因为我正在编写大量脚本,所有这些脚本都需要这种输入样式,但其中一些可能会以不同的方式使用它们的'input' 参数(例如一个可能需要两个这样的参数,一个可能是input1 3 4 randomInfo input2 或--first input1 --second input2 等)这意味着如果我在后处理中这样做,我通常无法知道应该解析哪些参数:
# This doesn't work:
def parse_args(parser):
parser.add_argument('--type', choices=('single-file', 'directory'), required=True)
args = parser.parse_args()
parser = load_single_file if args.type== 'single-file' else load_directory
# Which elements of `args` should have `parser` applied to it? It's impossible to tell.
# I cannot just specify `'input'` here too, as some scripts may want multiple or interspersed inputs.
我可以将这种行为收集到一个函数中对我来说也很重要,因为我有几个参数(不仅仅是--type)会影响解析数据的方式(例如--filter 过滤掉一些数据)
总结:
- 给定
--type Value,input应根据Value进行不同的解析 - 我不想通过后处理
parse_args()来处理这种不同的解析,因为这需要了解我的“库”中没有的特定脚本的参数。 - 我正在编写大量密切相关的脚本,都需要这个接口,这就是为什么我想抽象出一个通用的
parse_args(parser)或类似的函数。
【问题讨论】:
-
type函数执行时,无法访问namespace,因此无法检查其他参数的值。并且不能保证首先给出'--type'。认真重新审视解析后的选项。还有load_file和load_dirctectory听起来像是对名称的操作,而不是简单的字符串转换和测试(如int)。即使是内置的 File_Type` 类也更适合小脚本,而不是大脚本。 -
type函数接受一个字符串,并且应该返回一个新对象以放入args命名空间对象(或引发错误)。最常用的是int和float。FileType返回打开的file对象(未加载),用于快速输入/输出脚本。它并没有很好地老化,因为现在 Python 建议在with上下文中打开文件,一旦加载完成就可以关闭它们。argparse并非旨在成为一个无所不能的工具。它的主要目的是解析用户输入,方便错误和帮助。 -
@hpaulj 我愿意在后期处理中这样做,但前提是我可以解决知道
args命名空间对象的哪些 元素应该是的问题后处理...
标签: python python-3.x argparse