Python如何将带--标记的命令参数字符串解析为字典
实现方案
直接通过字符串分割即可实现需求,完整代码如下:
@client.command() async def embed(ctx, *, args: str): # 参数解析函数 def parse_args(args_str: str) -> dict: parsed = {} # 按--分割所有参数块,过滤空内容 arg_blocks = [block.strip() for block in args_str.split("--") if block.strip()] for block in arg_blocks: # 仅分割第一个空格,区分参数名和参数值 parts = block.split(maxsplit=1) if len(parts) == 2: key, value = parts parsed[key] = value return parsed args_dict = parse_args(args) # 后续生成Embed的示例逻辑 from discord import Embed # 直接用解析出的字典生成Embed target_embed = Embed.from_dict(args_dict) await ctx.send(embed=target_embed)
逻辑说明
- 首先把传入的所有参数字符串按
--分割,得到每个参数对应的内容块,过滤掉分割产生的首尾空字符串 - 对每个内容块,仅切割第一个空格,前面的部分就是参数名,后面的全部内容就是参数值,不需要考虑值本身带空格的情况
- 把所有键值对存入字典返回即可
拓展支持
如果需要支持不带值的布尔类参数,比如!embed --title Test --no-footer这类用法,可以在解析函数里增加判断:
for block in arg_blocks: parts = block.split(maxsplit=1) if len(parts) == 2: key, value = parts parsed[key] = value # 新增布尔参数支持,无值的参数默认赋值为True elif len(parts) == 1: parsed[parts[0]] = True
注意
当前实现不支持参数值本身包含--的场景,如果有这类需求可以额外增加引号包裹的匹配逻辑,普通使用场景下上述代码完全够用。
内容的提问来源于stack exchange,提问作者Blank
相关产品推荐
相关产品推荐

