From 9b7f5c6be6c9880f0f95e49722cbbe7f9e5d1e51 Mon Sep 17 00:00:00 2001 From: "Youtong0826.w" <91408029+Youtong0826@users.noreply.github.com> Date: Fri, 14 Oct 2022 10:27:47 +0800 Subject: [PATCH] Fix errors that will occur in python3.11 (#1680) Apply correct fix for MISSING default Co-authored-by: BobDotCom <71356958+BobDotCom@users.noreply.github.com> --- discord/ext/commands/flags.py | 14 +++++++------- discord/utils.py | 6 ++++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/discord/ext/commands/flags.py b/discord/ext/commands/flags.py index 82183fb368..ffc80fb254 100644 --- a/discord/ext/commands/flags.py +++ b/discord/ext/commands/flags.py @@ -31,7 +31,7 @@ from dataclasses import dataclass, field from typing import TYPE_CHECKING, Any, Iterator, Literal, Pattern, TypeVar, Union -from discord.utils import MISSING, maybe_coroutine, resolve_annotation +from discord.utils import MISSING, MissingField, maybe_coroutine, resolve_annotation from .converter import run_converters from .errors import ( @@ -81,13 +81,13 @@ class Flag: Whether multiple given values overrides the previous value. """ - name: str = MISSING + name: str = MissingField 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 = MissingField + annotation: Any = MissingField + default: Any = MissingField + max_args: int = MissingField + override: bool = MissingField cast_to_dict: bool = False @property diff --git a/discord/utils.py b/discord/utils.py index 9f1cb4f801..6cefb3531b 100644 --- a/discord/utils.py +++ b/discord/utils.py @@ -38,6 +38,7 @@ 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 @@ -114,6 +115,11 @@ 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: