Как исправить ошибку «is not a valid parameter annotation» слэш-команды в когах?
При регистрации слэш команды play в когах, бот пишет ошибку
@commands.slash_command(name='play', description='Playing Music') async def _play(self, ctx: commands.Context, *, search: str): if not ctx.voice_state.voice: await ctx.invoke(self._join) async with ctx.typing(): try: source = await YTDLSource.create_source(ctx, search, loop=self.bot.loop) except YTDLError as e: await ctx.send('Произошла ошибка при обработке этого запроса: {}'.format(str(e))) else: song = Song(source) await ctx.voice_state.songs.put(song) await ctx.send('Успешно добавлено {}'.format(str(source))) @_join.before_invoke @_play.before_invoke async def ensure_voice_state(self, ctx: commands.Context): if not ctx.author.voice or not ctx.author.voice.channel: raise commands.CommandError('Сначала подключись к голосовому.') if ctx.voice_client: if ctx.voice_client.channel != ctx.author.voice.channel: raise commands.CommandError('Бот уже подключен с голосовому каналу.') |
@commands.slash_command(name='play', description='Playing Music') async def _play(self, ctx: commands.Context, *, search: str): if not ctx.voice_state.voice: await ctx.invoke(self._join) async with ctx.typing(): try: source = await YTDLSource.create_source(ctx, search, loop=self.bot.loop) except YTDLError as e: await ctx.send('Произошла ошибка при обработке этого запроса: {}'.format(str(e))) else: song = Song(source) await ctx.voice_state.songs.put(song) await ctx.send('Успешно добавлено {}'.format(str(source))) @_join.before_invoke @_play.before_invoke async def ensure_voice_state(self, ctx: commands.Context): if not ctx.author.voice or not ctx.author.voice.channel: raise commands.CommandError('Сначала подключись к голосовому.') if ctx.voice_client: if ctx.voice_client.channel != ctx.author.voice.channel: raise commands.CommandError('Бот уже подключен с голосовому каналу.')
Вот ошибка:
C:UsersUserAppDataLocalProgramsPythonPython312python.exe C:UsersUserDesktopAgainstEvilcogsmusic.py
Traceback (most recent call last):
File "C:UsersUserDesktopAgainstEvilcogsmusic.py", line 248, in
class Music(commands.Cog):
File "C:UsersUserDesktopAgainstEvilcogsmusic.py", line 383, in Music
@commands.slash_command(name='play', description='Playing Music')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:UsersUserAppDataLocalProgramsPythonPython312Libsite-packagesdisnakeextcommandsslash_core.py", line 825, in decorator
return InvokableSlashCommand(
^^^^^^^^^^^^^^^^^^^^^^
File "C:UsersUserAppDataLocalProgramsPythonPython312Libsite-packagesdisnakeextcommandsslash_core.py", line 452, in __init__
options = expand_params(self)
^^^^^^^^^^^^^^^^^^^
File "C:UsersUserAppDataLocalProgramsPythonPython312Libsite-packagesdisnakeextcommandsparams.py", line 1094, in expand_params
_, inter_param, params, injections = collect_params(command.callback, sig)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:UsersUserAppDataLocalProgramsPythonPython312Libsite-packagesdisnakeextcommandsparams.py", line 1000, in collect_params
paraminfo = ParamInfo.from_param(parameter, {}, doc)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:UsersUserAppDataLocalProgramsPythonPython312Libsite-packagesdisnakeextcommandsparams.py", line 627, in from_param
self.parse_annotation(type_hints.get(param.name, param.annotation))
File "C:UsersUserAppDataLocalProgramsPythonPython312Libsite-packagesdisnakeextcommandsparams.py", line 784, in parse_annotation
raise TypeError(f"{annotation!r} is not a valid parameter annotation")
TypeError: is not a valid parameter annotation
Подскажите пожалуйста, как исправить ее.
Дополнительно:
Ответы:
В слеш командах типы не просто показывают что за объект, но и выполняют конвертацию.
Документацией в слеш командах разрешены следующие типы
str int float bool disnake.abc.GuildChannel* disnake.User or disnake.Member** disnake.Role** disnake.Attachment disnake.abc.Snowflake*** |
str int float bool disnake.abc.GuildChannel* disnake.User or disnake.Member** disnake.Role** disnake.Attachment disnake.abc.Snowflake***
Судя по тому, что вы пытаетесь принимать commands.Context, которого в слеш командах нет, вы с предыдущих вопросов так и не ознакомились с различиями между обычными командами и слешами.
Как исправить ошибку
Либо переписать функцию, потому что во взаимодействии нет методов и атрибутов, которые вы пытаетесь использовать, либо оставить команду обычной.
Для слеш-команд используется disnake.ApplicationCommandInteraction.
async def _play(self, inter: disnake.ApplicationCommandInteraction, *, search: str): |
async def _play(self, inter: disnake.ApplicationCommandInteraction, *, search: str):
- Пробовал, но inter там не используется, так же ты не указал ctx.
Если сделать так:
async def _play(self, ctx, inter: disnake.ApplicationCommandInteraction, *, search: str):
async def _play(self, ctx, inter: disnake.ApplicationCommandInteraction, *, search: str):
То будет такая ошибка:
Traceback (most recent call last):
File "C:UsersUserDesktopAgainstEvilcogsmusic.py", line 248, in
class Music(commands.Cog):
File "C:UsersUserDesktopAgainstEvilcogsmusic.py", line 383, in Music
@commands.slash_command(name='play', description='Playing Music')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:UsersUserAppDataLocalProgramsPythonPython312Libsite-packagesdisnakeextcommandsslash_core.py", line 825, in decorator
return InvokableSlashCommand(
^^^^^^^^^^^^^^^^^^^^^^
File "C:UsersUserAppDataLocalProgramsPythonPython312Libsite-packagesdisnakeextcommandsslash_core.py", line 452, in __init__
options = expand_params(self)
^^^^^^^^^^^^^^^^^^^
File "C:UsersUserAppDataLocalProgramsPythonPython312Libsite-packagesdisnakeextcommandsparams.py", line 1094, in expand_params
_, inter_param, params, injections = collect_params(command.callback, sig)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:UsersUserAppDataLocalProgramsPythonPython312Libsite-packagesdisnakeextcommandsparams.py", line 989, in collect_params
raise TypeError(
TypeError: Found two candidates for the interaction parameter in : ctx and interЕсли сделать так:
async def _play(self, ctx: disnake.ApplicationCommandInteraction, *, search: str):
async def _play(self, ctx: disnake.ApplicationCommandInteraction, *, search: str):
То будет такая ошибка:
Ignoring exception in on_application_command
Traceback (most recent call last):
File "C:UsersUserAppDataLocalProgramsPythonPython312Libsite-packagesdisnakeclient.py", line 703, in _run_event
await coro(*args, **kwargs)
File "C:UsersUserAppDataLocalProgramsPythonPython312Libsite-packagesdisnakeextcommandsinteraction_bot_base.py", line 1386, in on_application_command
await self.process_application_commands(interaction)
File "C:UsersUserAppDataLocalProgramsPythonPython312Libsite-packagesdisnakeextcommandsinteraction_bot_base.py", line 1378, in process_application_commands
await app_command.invoke(interaction)
File "C:UsersUserAppDataLocalProgramsPythonPython312Libsite-packagesdisnakeextcommandsslash_core.py", line 717, in invoke
await self.prepare(inter)
File "C:UsersUserAppDataLocalProgramsPythonPython312Libsite-packagesdisnakeextcommandsbase_core.py", line 322, in prepare
await self.call_before_hooks(inter)
File "C:UsersUserAppDataLocalProgramsPythonPython312Libsite-packagesdisnakeextcommandsbase_core.py", line 463, in call_before_hooks
await self._before_invoke(instance, inter) # type: ignore
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:UsersUserDesktopAgainstEvilcogsmusic.py", line 406, in ensure_voice_state
if ctx.voice_client:
^^^^^^^^^^^^^^^^
AttributeError: 'ApplicationCommandInteraction' object has no attribute 'voice_client' - Я все верно указал. Перепишите код под inter: disnake.ApplicationCommandInteraction, вместо ctx. И почитайте документацию.
https://docs.disnake.dev/en/latest/ext/commands/co...
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для исправления ошибки "is not a valid parameter annotation" в слэш-командах в Когах, вам нужно убедиться, что вы правильно используете аннотации параметров. Ошибка указывает на то, что аннотация параметра не распознана или неверно синтаксически оформлена.
В Когах аннотации параметров должны быть оформлены в определенном формате. Например, если вы хотите указать тип параметра, вы должны использовать синтаксис @param {тип} {имя параметра}. Проверьте, что вы используете правильный синтаксис для всех аннотаций параметров в вашем коде.
Пример правильного использования аннотации параметра в Когах:
/** * @param {string} $name */ function greet($name) { return "Hello, $name!"; }
Если ошибка по-прежнему возникает, убедитесь, что вы не делаете опечаток или не используете неподдерживаемые символы в аннотациях параметров. Также убедитесь, что вы используете последнюю версию Когах, чтобы избежать возможных проблем с устаревшими функциями или синтаксисом.
Если после всех этих действий ошибка все еще остается, попробуйте переписать код, используя более простой и понятный синтаксис аннотаций параметров. Иногда сложные конструкции могут вызывать ошибки, которые трудно выявить.
Надеюсь, эти советы помогут вам исправить ошибку "is not a valid parameter annotation" в слэш-командах в Когах. Если у вас остались дополнительные вопросы, не стесняйтесь задавать их для получения более подробной помощи.