diff --git a/CHANGELOG.md b/CHANGELOG.md index f8cbf22732..fdfdc6d896 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -107,6 +107,8 @@ These changes are available on the `master` branch, but have not yet been releas ([#2739](https://github.com/Pycord-Development/pycord/pull/2739)) - Fixed missing `None` type hints in `Select.__init__`. ([#2746](https://github.com/Pycord-Development/pycord/pull/2746)) +- Fixed `TypeError` when using `Flag` with Python 3.11+. + ([#2759](https://github.com/Pycord-Development/pycord/pull/2759)) - Fixed `TypeError` when specifying `thread_name` in `Webhook.send`. ([#2761](https://github.com/Pycord-Development/pycord/pull/2761)) - Updated `valid_locales` to support `in` and `es-419`. diff --git a/discord/ext/commands/flags.py b/discord/ext/commands/flags.py index 54e7e0c37c..ebe54ab5fd 100644 --- a/discord/ext/commands/flags.py +++ b/discord/ext/commands/flags.py @@ -31,12 +31,11 @@ from dataclasses import dataclass, field from typing import TYPE_CHECKING, Any, Iterator, Literal, Pattern, TypeVar, Union -from discord.utils import MISSING, MissingField, maybe_coroutine, resolve_annotation - -if sys.version_info >= (3, 11): - _MISSING = MissingField -else: - _MISSING = MISSING +from discord.utils import ( + MISSING, + maybe_coroutine, + resolve_annotation, +) from .converter import run_converters from .errors import ( @@ -59,6 +58,10 @@ from .context import Context +def _missing_field_factory() -> field: + return field(default_factory=lambda: MISSING) + + @dataclass class Flag: """Represents a flag parameter for :class:`FlagConverter`. @@ -86,13 +89,13 @@ class Flag: Whether multiple given values overrides the previous value. """ - name: str = _MISSING + name: str = _missing_field_factory() aliases: list[str] = field(default_factory=list) - attribute: str = _MISSING - annotation: Any = _MISSING - default: Any = _MISSING - max_args: int = _MISSING - override: bool = _MISSING + attribute: str = _missing_field_factory() + annotation: Any = _missing_field_factory() + default: Any = _missing_field_factory() + max_args: int = _missing_field_factory() + override: bool = _missing_field_factory() cast_to_dict: bool = False @property diff --git a/discord/utils.py b/discord/utils.py index 363d339391..5e40069224 100644 --- a/discord/utils.py +++ b/discord/utils.py @@ -39,7 +39,6 @@ import warnings from base64 import b64encode from bisect import bisect_left -from dataclasses import field from inspect import isawaitable as _isawaitable from inspect import signature as _signature from operator import attrgetter @@ -115,11 +114,6 @@ def __repr__(self) -> str: MISSING: Any = _MissingSentinel() -# As of 3.11, directly setting a dataclass field to MISSING causes a ValueError. Using -# field(default=MISSING) produces the same error, but passing a lambda to -# default_factory produces the same behavior as default=MISSING and does not raise an -# error. -MissingField = field(default_factory=lambda: MISSING) class _cached_property: