Как исправить ошибку «is not a valid parameter annotation» слэш-команды в когах?

Ссылка скопирована
1 ответ

При регистрации слэш команды 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...

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Елена Вебер Ответ

Для исправления ошибки "is not a valid parameter annotation" в слэш-командах в Когах, вам нужно убедиться, что вы правильно используете аннотации параметров. Ошибка указывает на то, что аннотация параметра не распознана или неверно синтаксически оформлена.

В Когах аннотации параметров должны быть оформлены в определенном формате. Например, если вы хотите указать тип параметра, вы должны использовать синтаксис @param {тип} {имя параметра}. Проверьте, что вы используете правильный синтаксис для всех аннотаций параметров в вашем коде.

Пример правильного использования аннотации параметра в Когах:

/**
 * @param {string} $name
 */
function greet($name) {
    return "Hello, $name!";
}

/** * @param {string} $name */ function greet($name) { return "Hello, $name!"; }

Если ошибка по-прежнему возникает, убедитесь, что вы не делаете опечаток или не используете неподдерживаемые символы в аннотациях параметров. Также убедитесь, что вы используете последнюю версию Когах, чтобы избежать возможных проблем с устаревшими функциями или синтаксисом.

Если после всех этих действий ошибка все еще остается, попробуйте переписать код, используя более простой и понятный синтаксис аннотаций параметров. Иногда сложные конструкции могут вызывать ошибки, которые трудно выявить.

Надеюсь, эти советы помогут вам исправить ошибку "is not a valid parameter annotation" в слэш-командах в Когах. Если у вас остались дополнительные вопросы, не стесняйтесь задавать их для получения более подробной помощи.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно