-
问题描述我希望能在 run_preprocessor 中对 matcher 的 permission_updater 进行动态的调整 from nonebot.matcher import Matcher
from nonebot.permission import Permission
from nonebot.adapters.onebot.v11.bot import Bot
from nonebot.message import run_preprocessor
class TestPermission:
def __init__(self, self_id: str) -> None:
self.self_id = self_id
async def __call__(self, bot: Bot) -> bool:
return bot.self_id == self.self_id
def test_permission_updater(self_id: str) -> Permission:
return Permission(TestPermission(self_id=self_id))
@run_preprocessor
async def unique_bot_responding_limit(bot: Bot, matcher: Matcher):
matcher.permission_updater(test_permission_updater(self_id=bot.self_id)) 然后, 在运行一个类似这样的 matcher 时: test = on_command('test')
@test.got('arg', prompt='please input arg')
async def handle_arg(arg: str = ArgStr('arg')):
... 会抛出如下异常: Traceback (most recent call last):
File "C:\MyProjectFolder\venv\lib\site-packages\nonebot\internal\matcher.py", line 668, in run
await self.simple_run(bot, event, state, stack, dependency_cache)
File "C:\MyProjectFolder\venv\lib\site-packages\nonebot\internal\matcher.py", line 635, in simple_run
await handler(
File "C:\MyProjectFolder\venv\lib\site-packages\nonebot\dependencies\__init__.py", line 89, in __call__
values = await self.solve(**kwargs)
File "C:\MyProjectFolder\venv\lib\site-packages\nonebot\dependencies\__init__.py", line 191, in solve
await param._solve(**params)
File "C:\MyProjectFolder\venv\lib\site-packages\nonebot\internal\params.py", line 151, in _solve
solved = await task
File "C:\MyProjectFolder\venv\lib\site-packages\nonebot\internal\matcher.py", line 410, in _key_getter
await matcher.reject(prompt)
File "C:\MyProjectFolder\venv\lib\site-packages\nonebot\internal\matcher.py", line 498, in reject
raise RejectedException
nonebot.exception.RejectedException
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\MyProjectFolder\venv\lib\site-packages\nonebot\message.py", line 153, in _check_matcher
await _run_matcher(Matcher, bot, event, state, stack, dependency_cache)
> File "C:\MyProjectFolder\venv\lib\site-packages\nonebot\message.py", line 202, in _run_matcher
await matcher.run(bot, event, state, stack, dependency_cache)
File "C:\MyProjectFolder\venv\lib\site-packages\nonebot\internal\matcher.py", line 673, in run
permission = await self.update_permission(bot, event)
File "C:\MyProjectFolder\venv\lib\site-packages\nonebot\internal\matcher.py", line 603, in update_permission
return await updater(bot=bot, event=event, state=self.state, matcher=self)
File "C:\MyProjectFolder\venv\lib\site-packages\nonebot\dependencies\__init__.py", line 89, in __call__
values = await self.solve(**kwargs)
File "C:\MyProjectFolder\venv\lib\site-packages\nonebot\dependencies\__init__.py", line 201, in solve
values[field.name] = check_field_type(field, value)
File "C:\MyProjectFolder\venv\lib\site-packages\nonebot\dependencies\utils.py", line 51, in check_field_type
_, errs_ = field.validate(value, {}, loc=())
File "pydantic\fields.py", line 829, in pydantic.fields.ModelField.validate
assert cls is not None
AssertionError 请求解答
环境信息
|
Beta Was this translation helpful? Give feedback.
Answered by
yanyongyu
May 14, 2022
Replies: 1 comment 3 replies
-
matcher 实例化后修改permission updater会直接修改Matcher类的updater,影响到所有实例。 至于报错原因,看上去是因为ForwardRef的原因,你的代码中是否有 补充:问题应该在这段代码的bot参数标注类型没能正确识别 async def __call__(self, bot: Bot) -> bool: |
Beta Was this translation helpful? Give feedback.
3 replies
Answer selected by
yanyongyu
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
matcher 实例化后修改permission updater会直接修改Matcher类的updater,影响到所有实例。
至于报错原因,看上去是因为ForwardRef的原因,你的代码中是否有
from __future__ import annotations
这种语句,导致没有识别到具体的类,但是nb对这种情况会有Warning处理,也不应该报错才对。补充:问题应该在这段代码的bot参数标注类型没能正确识别