GraiaProject / Ariadne

一个优雅且完备的 Python QQ 自动化框架,基于 Mirai API HTTP v2。 Powered by Graia Project.
https://graia.cn/ariadne
GNU Affero General Public License v3.0
741 stars 45 forks source link

[Bug] `Sparkle` 中 `__getitem__` 和 `get` 方法的 `item` 参数类型注解有误 #113

Closed Redlnn closed 2 years ago

Redlnn commented 2 years ago

问题 Sparkle__getitem__get 方法的 item 参数类型注解为 str 但实际上通过 from_command 创建的 Matchdest 类型可为int

>>> t = Twilight.from_command('text {0} {1} {2}')
>>> print(type(t.matcher.match_ref[ParamMatch][0].dest))
<class 'int'>

检查后发现是 graia.ariadne.message.parser.utiltokenize_command 函数 126 行的 int(i) if re.match(r"\d+", i) else unescape(i) for i in "".join(char_stk).split("|") 所导致的,因不清楚此处的 int(i) 有何作用,所以开一个 issue

BlueGlassBlock commented 2 years ago

。。?现在 MatchResult 的分派操作不需要支持 int

你可以让这个跑起来吗:

def (1: MatchResult): ...
Redlnn commented 2 years ago

。。?现在 MatchResult 的分派操作不需要支持 int

你可以让这个跑起来吗:

def (1: MatchResult): ...

那如果 from_command 这样写的话,怎么拿 {1} 的匹配结果,我这样写会在 target[1] 会标红,target['1'] 会 KeyError,target['t'] 则正常

@bcc.receiver(
    GroupMessage,
    dispatchers=[
        Twilight.from_command('test {t} {1} {2}')
    ],
)
async def b(msg: MessageChain, target: Sparkle, t: MatchResult):
    print(msg)
    print(target[1])
    print(target['t'])
    print(t)