getsentry / getsentry/sentry-python
Replace `ClientConstructor` with a `TypedDict`
- Vorherrschende Sprache
- Python
- Sterne
- 2.2k
- Forks
- 669
- Ø Merge
- 1 T. 1 Std.
- Gemergte PRs (30 T.)
- 213
Beschreibung
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 https://github.com/getsentry/sentry-python/pull/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 within `Client.__init__`. Currently, `**kwargs` is recognized as a `dict[str, Any]`, which is type-unsafe.
- `mypy` currently incorrectly recognizes the arguments in `ClientConstructor` as all being valid positional arguments, when in reality, only the `dsn` may be provided as a positional argument. Providing any other arguments as positional arguments [results in a `TypeError`](https://github.com/getsentry/sentry-python/blob/16d25e20098583833d4e7827fcd76ad0940e0f2c/sentry_sdk/client.py#L86-L87). With a `TypedDict`, `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`.
Beitragsleitfaden
Bewertung
Dieses Issue wurde noch nicht bewertet.