Open
Description
We currently use ClientConstructor
to trick mypy (and other static analyzers) into believing that Client.__init__
takes many typed parameters, rather than untyped **kwargs
. The current solution is somewhat hacky, as it separates the Client
class's actual implementation into a separate _Client
class.
We could instead define a TypedDict
with the parameters accepted in Client.__init__
's **kwargs
, and type the **kwargs
with this TypedDict
. I have already implemented similar functionality for start_transaction
in #2796.
Advantages of switching to a TypedDict
include:
- Code is clearer, since we are not fooling
mypy
with hacky workarounds. mypy
enforces the**kwargs
's types withinClient.__init__
. Currently,**kwargs
is recognized as adict[str, Any]
, which is type-unsafe.mypy
currently incorrectly recognizes the arguments inClientConstructor
as all being valid positional arguments, when in reality, only thedsn
may be provided as a positional argument. Providing any other arguments as positional arguments results in aTypeError
. With aTypedDict
,mypy
is aware that the arguments must be passed as keyword arguments.
Disadvantages of switching to a TypedDict
:
- The current solution allows us to indicate the default value's of the arguments, when they are not provided. Specifying default values may not be possible with a
TypedDict
.