从字符串中提取脚本参数名称和值

Extract script parameter name and value from string

我目前有一个进程执行器,它执行脚本和参数。脚本和参数由用户提供。

  execute_script(script_name: str, parameters: str) -> None :
        // Some logic
        subprocess.Popen( ....)

用户以字符串形式提供脚本名称和参数。 execute_script(...) 是一个后端函数,最终由暴露给用户的 API 调用。因此,即使参数作为命令行参数执行,它们也不会作为命令行参数接收,而是作为字符串变量接收。

例如:

我无法控制您的用户发送的参数。我们有很多这样的剧本,而且还在不断增加。因此跟踪每个脚本的潜在参数是不可行的。

我需要确保在与特定脚本结合使用时,某些参数只使用允许的值。 例如:

我想将提供给函数的参数从字符串转换为映射,以便更容易提取和验证脚本参数的值。

使用space作为分隔符来拆分和解析字符串似乎不是最干净的方法。是否有更紧凑的方法将参数从 string 转换为 map ? 或者,还有其他解析字符串的建议吗?

我认为您可以结合使用 shlexargparse

使用 shlex.split 来标记参数,然后使用 argparse.ArgumentParserparse_known_args 来计算您关心的检查值。

import argparse
import shlex

script_name = "generate_report"
parameters = "--duration 'quarterly' --dept 'Finance'"
parser_argv = [script_name, *shlex.split(parameters)]

parser = argparse.ArgumentParser()
parser.add_argument("--duration")
args, unknown = parser.parse_known_args(parser_argv)

if script_name == "generate_report":
    if args.duration not in {"quarterly", "monthly"}:
        raise ValueError(
            f"Incorrect duration for generate_report: {args.duration}"
        )

这种设计的一个好处是,如果您最终调用的脚本已经在 python 中,您可以在这些工具中公开 argparse 设置并直接在您的方法中使用它们。

这意味着您不会复制解析器代码,从而允许您尽可能接近此验证器中的实际脚本进行验证。