From 9d05f55ddb8144a1992972a0118373b5af1a8f02 Mon Sep 17 00:00:00 2001 From: Rapptz Date: Mon, 11 Apr 2022 19:18:19 -0400 Subject: [PATCH] [commands] Fix Optional handling when the inner type is a converter --- discord/ext/commands/hybrid.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/discord/ext/commands/hybrid.py b/discord/ext/commands/hybrid.py index 89d1ab4d0..42be6bec3 100644 --- a/discord/ext/commands/hybrid.py +++ b/discord/ext/commands/hybrid.py @@ -136,11 +136,21 @@ def replace_parameters(parameters: Dict[str, Parameter], signature: inspect.Sign params = signature.parameters.copy() for name, parameter in parameters.items(): is_transformer = hasattr(parameter.converter, '__discord_app_commands_transformer__') + origin = getattr(parameter.converter, '__origin__', None) if is_converter(parameter.converter) and not is_transformer: params[name] = params[name].replace(annotation=make_converter_transformer(parameter.converter)) - if callable(parameter.converter) and not inspect.isclass(parameter.converter) and not is_transformer: + + # Special case Optional[X] where X is a single type that can optionally be a converter + elif origin is Union and len(parameter.converter.__args__) == 2 and parameter.converter.__args__[-1] is _NoneType: + inner = parameter.converter.__args__[0] + is_inner_tranformer = hasattr(inner, '__discord_app_commands_transformer__') + if is_converter(inner) and not is_inner_tranformer: + params[name] = params[name].replace(annotation=Optional[make_converter_transformer(inner)]) # type: ignore + + elif callable(parameter.converter) and not inspect.isclass(parameter.converter) and not is_transformer: params[name] = params[name].replace(annotation=make_callable_transformer(parameter.converter)) - if callable(parameter.default): + + if parameter.default is not parameter.empty and callable(parameter.default): params[name] = params[name].replace(default=_CallableDefault(parameter.default)) if isinstance(params[name].default, Parameter):