From bc528f1b1da8a6e2addef92d328c85cf99ac21b4 Mon Sep 17 00:00:00 2001 From: Paillat Date: Tue, 1 Apr 2025 11:42:39 +0200 Subject: [PATCH 1/4] :bug: Fix `dataclasses.field` can't be reused --- discord/ext/commands/flags.py | 24 ++++++++++++------------ discord/utils.py | 5 ++++- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/discord/ext/commands/flags.py b/discord/ext/commands/flags.py index 54e7e0c37c..f8afabf56a 100644 --- a/discord/ext/commands/flags.py +++ b/discord/ext/commands/flags.py @@ -31,12 +31,12 @@ 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, + missing_field_factory, + resolve_annotation, +) from .converter import run_converters from .errors import ( @@ -86,13 +86,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..7aca0865b9 100644 --- a/discord/utils.py +++ b/discord/utils.py @@ -119,7 +119,10 @@ def __repr__(self) -> str: # 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) + + +def missing_field_factory() -> field: + return field(default_factory=lambda: MISSING) class _cached_property: From 5360a61a799a200174495259366509702af504d4 Mon Sep 17 00:00:00 2001 From: Paillat Date: Tue, 1 Apr 2025 11:56:58 +0200 Subject: [PATCH 2/4] :memo: CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 38725e4141..cbd66700f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -103,6 +103,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) ### Changed From d9c39f0610ed04959414664452fc0f91a8553783 Mon Sep 17 00:00:00 2001 From: Dorukyum <53639936+Dorukyum@users.noreply.github.com> Date: Wed, 4 Jun 2025 13:03:14 +0300 Subject: [PATCH 3/4] Update CHANGELOG.md Signed-off-by: Dorukyum <53639936+Dorukyum@users.noreply.github.com> --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce320b05dc..1887182e9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -103,10 +103,10 @@ 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) - Updated `valid_locales` to support `in` and `es-419`. ([#2767])(https://github.com/Pycord-Development/pycord/pull/2767) +- Fixed `TypeError` when using `Flag` with Python 3.11+. + ([#2759])(https://github.com/Pycord-Development/pycord/pull/2759) ### Changed From 51836c694f93d6b4a388f27ed0ded051d14d6506 Mon Sep 17 00:00:00 2001 From: Paillat Date: Thu, 5 Jun 2025 15:29:22 +0200 Subject: [PATCH 4/4] :recycle: Move `_missing_field_factory` to flags.py and remove incorrect comment --- discord/ext/commands/flags.py | 17 ++++++++++------- discord/utils.py | 9 --------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/discord/ext/commands/flags.py b/discord/ext/commands/flags.py index f8afabf56a..ebe54ab5fd 100644 --- a/discord/ext/commands/flags.py +++ b/discord/ext/commands/flags.py @@ -34,7 +34,6 @@ from discord.utils import ( MISSING, maybe_coroutine, - missing_field_factory, resolve_annotation, ) @@ -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_field_factory() + name: str = _missing_field_factory() aliases: list[str] = field(default_factory=list) - 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() + 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 7aca0865b9..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,14 +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. - - -def missing_field_factory() -> field: - return field(default_factory=lambda: MISSING) class _cached_property: