从字符串中提取脚本参数名称和值
Extract script parameter name and value from string
我目前有一个进程执行器,它执行脚本和参数。脚本和参数由用户提供。
execute_script(script_name: str, parameters: str) -> None :
// Some logic
subprocess.Popen( ....)
用户以字符串形式提供脚本名称和参数。 execute_script(...)
是一个后端函数,最终由暴露给用户的 API 调用。因此,即使参数作为命令行参数执行,它们也不会作为命令行参数接收,而是作为字符串变量接收。
例如:
- script_name="sendEmail", parameters="--subject 'URGENT' --to 'xyz@redif.com, abc@hotmail.com'"
- script_name="calculatePerformance", parameters="--revenue 193456343 --tax_per 32543 --operating_cost 3452564.256 --includeVacationDays"
- script_name="generate_report", parameters"--duration 'quarterly' --dept 'Finance'"
我无法控制您的用户发送的参数。我们有很多这样的剧本,而且还在不断增加。因此跟踪每个脚本的潜在参数是不可行的。
我需要确保在与特定脚本结合使用时,某些参数只使用允许的值。
例如:
- 如果脚本是 generate_report,持续时间只能是每季度或每月。对于任何其他脚本,可以提供任何值。
我想将提供给函数的参数从字符串转换为映射,以便更容易提取和验证脚本参数的值。
使用space作为分隔符来拆分和解析字符串似乎不是最干净的方法。是否有更紧凑的方法将参数从 string 转换为 map ?
或者,还有其他解析字符串的建议吗?
我认为您可以结合使用 shlex
和 argparse
。
使用 shlex.split
来标记参数,然后使用 argparse.ArgumentParser
和 parse_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 设置并直接在您的方法中使用它们。
这意味着您不会复制解析器代码,从而允许您尽可能接近此验证器中的实际脚本进行验证。
我目前有一个进程执行器,它执行脚本和参数。脚本和参数由用户提供。
execute_script(script_name: str, parameters: str) -> None :
// Some logic
subprocess.Popen( ....)
用户以字符串形式提供脚本名称和参数。 execute_script(...)
是一个后端函数,最终由暴露给用户的 API 调用。因此,即使参数作为命令行参数执行,它们也不会作为命令行参数接收,而是作为字符串变量接收。
例如:
- script_name="sendEmail", parameters="--subject 'URGENT' --to 'xyz@redif.com, abc@hotmail.com'"
- script_name="calculatePerformance", parameters="--revenue 193456343 --tax_per 32543 --operating_cost 3452564.256 --includeVacationDays"
- script_name="generate_report", parameters"--duration 'quarterly' --dept 'Finance'"
我无法控制您的用户发送的参数。我们有很多这样的剧本,而且还在不断增加。因此跟踪每个脚本的潜在参数是不可行的。
我需要确保在与特定脚本结合使用时,某些参数只使用允许的值。 例如:
- 如果脚本是 generate_report,持续时间只能是每季度或每月。对于任何其他脚本,可以提供任何值。
我想将提供给函数的参数从字符串转换为映射,以便更容易提取和验证脚本参数的值。
使用space作为分隔符来拆分和解析字符串似乎不是最干净的方法。是否有更紧凑的方法将参数从 string 转换为 map ? 或者,还有其他解析字符串的建议吗?
我认为您可以结合使用 shlex
和 argparse
。
使用 shlex.split
来标记参数,然后使用 argparse.ArgumentParser
和 parse_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 设置并直接在您的方法中使用它们。
这意味着您不会复制解析器代码,从而允许您尽可能接近此验证器中的实际脚本进行验证。