discord.py如何无需双引号输入带空格长查询同时正常识别flags
问题原因
你之前的两种写法都不符合discord.py FlagConverter的参数解析规则:
- 第一种写法中
query是普通位置参数,默认仅会匹配第一个空格前的输入内容,带空格的文本必须用双引号包裹才会被识别为单个字符串参数。 - 第二种写法中
*会将命令名之后的所有输入内容全部赋值给query,完全不会触发后续的Flag解析逻辑,因此会抛出options参数缺失的报错。
解决方案
利用discord.py 2.0+版本FlagConverter内置的rest参数,把歌曲名查询字段直接集成到Flag类中,调整代码如下:
1. 修改Options类定义
class Options(commands.FlagConverter, delimiter=" ", prefix="--"): # rest=True表示会捕获所有Flag参数之前的全部输入内容,不受空格限制 query: str = commands.Flag(rest=True) next: bool = False now: bool = False
2. 调整play命令定义
@commands.command(brief="play [track] <options>") async def play(self, ctx, *, options: Options) -> None: # 直接从options中取解析后的结果即可 query = options.query now = options.now next_flag = options.next # 后续原有业务逻辑保持不变
调整完成后,直接输入play Sweet Dreams --now就可以正常识别,不需要再加双引号包裹歌曲名。
实现原理
commands.Flag(rest=True)会标记对应字段为剩余内容捕获字段,FlagConverter解析参数时会自动将所有出现在任意--开头的Flag参数之前的输入内容,不管包含多少空格,都作为完整字符串赋值给该字段,同时不会影响后续Flag参数的正常解析。
内容的提问来源于stack exchange,提问作者Alado
相关产品推荐
相关产品推荐

