nonebot / adapter-discord

NoneBot2 Discord 适配器 / Discord adapter for nonebot2
20 stars 6 forks source link

给on_slash_command提供动态options时无法通过类型检查 #28

Open Shedarshian opened 3 months ago

Shedarshian commented 3 months ago

在使用on_slash_command新建斜杠指令时,为options提供动态的列表,会因为list不是covariant的而报错,即使是仅仅将两个静态列表相加也会报错。

MWE:

from nonebot.adapters.discord import on_slash_command
from nonebot.adapters.discord.api import StringOption
test = on_slash_command(name="test", description="test",
    options=[StringOption(name="1", description="1")] + [])

Pylance报错:

Argument of type "list[StringOption]" cannot be assigned to parameter "options" of type "List[AnyCommandOption] | None" in function "on_slash_command"
  Type "list[StringOption]" is incompatible with type "List[AnyCommandOption] | None"
    "list[StringOption]" is incompatible with "List[AnyCommandOption]"
      Type parameter "_T@list" is invariant, but "StringOption" is not the same as "AnyCommandOption"
      Consider switching from "list" to "Sequence" which is covariant
    "list[StringOption]" is incompatible with "None"

mypy报错:

Argument "options" to "on_slash_command" has incompatible type "list[StringOption]"; expected "list[SubCommandGroupOption | SubCommandOption | IntegerOption | StringOption | UserOption | ChannelOption | RoleOption | MentionableOption | NumberOption | BooleanOption | AttachmentOption] | None"Mypy[arg-type](https://mypy.readthedocs.io/en/latest/_refs.html#code-arg-type)
"List" is invariant -- see https://mypy.readthedocs.io/en/stable/common_issues.html#variance
Consider using "Sequence" instead, which is covariant
Autuamn commented 3 months ago

试试为动态的 options 指定类型

example:

from nonebot.adapters.discord import on_slash_command
from nonebot.adapters.discord.api import AnyCommandOption, StringOption

options: list[AnyCommandOption] = [StringOption(name="1", description="1")]

test = on_slash_command(name="test", description="test",
    options=options)
Shedarshian commented 3 months ago

唔 把它拆成两行似乎是可以的

options: list[AnyCommandOption] = [StringOption(name="1", description="1")]
options += []