diff --git a/CHANGES.rst b/CHANGES.rst index 985c8a0d72..6eef73136a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -6,6 +6,8 @@ Version 3.1.0 - ``Flask.open_resource``/``open_instance_resource`` and ``Blueprint.open_resource`` take an ``encoding`` parameter to use when opening in text mode. It defaults to ``utf-8``. :issue:`5504` +- Fixes Pyright type errors. :issue:`5549` + Version 3.0.3 ------------- diff --git a/src/flask/app.py b/src/flask/app.py index 53eb602c2a..0fe42093cf 100644 --- a/src/flask/app.py +++ b/src/flask/app.py @@ -349,7 +349,7 @@ def open_resource( path = os.path.join(self.root_path, resource) if mode == "rb": - return open(path, mode) + return open(path, mode) # pyright: ignore return open(path, mode, encoding=encoding) @@ -1163,7 +1163,10 @@ def make_response(self, rv: ft.ResponseReturnValue) -> Response: response object. """ - status = headers = None + status: int | None = None + headers: ( + Headers | dict[t.Any, t.Any] | tuple[t.Any, ...] | list[t.Any] | None + ) = None # unpack tuple returns if isinstance(rv, tuple): @@ -1171,11 +1174,11 @@ def make_response(self, rv: ft.ResponseReturnValue) -> Response: # a 3-tuple is unpacked directly if len_rv == 3: - rv, status, headers = rv # type: ignore[misc] + rv, status, headers = rv # type: ignore[assignment, misc] # decide if a 2-tuple has status or headers elif len_rv == 2: if isinstance(rv[1], (Headers, dict, tuple, list)): - rv, headers = rv + rv, headers = rv # type: ignore else: rv, status = rv # type: ignore[assignment,misc] # other sized tuples are not allowed @@ -1203,7 +1206,7 @@ def make_response(self, rv: ft.ResponseReturnValue) -> Response: rv = self.response_class( rv, status=status, - headers=headers, # type: ignore[arg-type] + headers=headers, ) status = headers = None elif isinstance(rv, (dict, list)): @@ -1243,7 +1246,7 @@ def make_response(self, rv: ft.ResponseReturnValue) -> Response: # extend existing headers with provided headers if headers: - rv.headers.update(headers) # type: ignore[arg-type] + rv.headers.update(headers) return rv diff --git a/src/flask/blueprints.py b/src/flask/blueprints.py index 86c5d59aa2..b6d4e43339 100644 --- a/src/flask/blueprints.py +++ b/src/flask/blueprints.py @@ -123,6 +123,6 @@ def open_resource( path = os.path.join(self.root_path, resource) if mode == "rb": - return open(path, mode) + return open(path, mode) # pyright: ignore return open(path, mode, encoding=encoding) diff --git a/src/flask/cli.py b/src/flask/cli.py index ecb292a01e..e41c5b9a47 100644 --- a/src/flask/cli.py +++ b/src/flask/cli.py @@ -15,6 +15,7 @@ from types import ModuleType import click +from _typeshed.wsgi import WSGIApplication from click.core import ParameterSource from werkzeug import run_simple from werkzeug.serving import is_running_from_reloader @@ -323,9 +324,9 @@ def load_app(self) -> Flask: """ if self._loaded_app is not None: return self._loaded_app - + app: Flask | None = None if self.create_app is not None: - app: Flask | None = self.create_app() + app = self.create_app() else: if self.app_import_path: path, name = ( @@ -549,7 +550,7 @@ def __init__( set_debug_flag: bool = True, **extra: t.Any, ) -> None: - params = list(extra.pop("params", None) or ()) + params: list[t.Any] = list(extra.pop("params", None) or ()) # Processing is done with option callbacks instead of a group # callback. This allows users to make a custom group callback # without losing the behavior. --env-file must come first so @@ -587,7 +588,7 @@ def _load_plugin_commands(self) -> None: # Use a backport on Python < 3.10. We technically have # importlib.metadata on 3.8+, but the API changed in 3.10, # so use the backport for consistency. - import importlib_metadata as metadata + import importlib_metadata as metadata # pyright: ignore for ep in metadata.entry_points(group="flask.commands"): self.add_command(ep.load(), ep.name) @@ -934,7 +935,7 @@ def run_command( option. """ try: - app: WSGIApplication = info.load_app() + app: WSGIApplication = info.load_app() # pyright: ignore except Exception as e: if is_running_from_reloader(): # When reloading, print out the error immediately, but raise diff --git a/src/flask/helpers.py b/src/flask/helpers.py index 00abe046b1..b8c3e9b8e9 100644 --- a/src/flask/helpers.py +++ b/src/flask/helpers.py @@ -587,7 +587,7 @@ def get_root_path(import_name: str) -> str: return os.getcwd() if hasattr(loader, "get_filename"): - filepath = loader.get_filename(import_name) + filepath = loader.get_filename(import_name) # pyright: ignore else: # Fall back to imports. __import__(import_name) diff --git a/src/flask/views.py b/src/flask/views.py index 794fdc06cf..53fe976dc2 100644 --- a/src/flask/views.py +++ b/src/flask/views.py @@ -61,7 +61,7 @@ def dispatch_request(self, name): #: decorator. #: #: .. versionadded:: 0.8 - decorators: t.ClassVar[list[t.Callable[[F], F]]] = [] + decorators: t.ClassVar[list[t.Callable[..., t.Any]]] = [] #: Create a new instance of this view class for every request by #: default. If a view subclass sets this to ``False``, the same @@ -110,7 +110,7 @@ def view(**kwargs: t.Any) -> ft.ResponseReturnValue: return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return] else: - self = cls(*class_args, **class_kwargs) + self = cls(*class_args, **class_kwargs) # pyright: ignore def view(**kwargs: t.Any) -> ft.ResponseReturnValue: return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return] diff --git a/src/flask/wrappers.py b/src/flask/wrappers.py index db3118e6ea..86bd3eab0a 100644 --- a/src/flask/wrappers.py +++ b/src/flask/wrappers.py @@ -129,11 +129,11 @@ def _load_form_data(self) -> None: def on_json_loading_failed(self, e: ValueError | None) -> t.Any: try: return super().on_json_loading_failed(e) - except BadRequest as e: + except BadRequest as e_badreq: if current_app and current_app.debug: raise - raise BadRequest() from e + raise BadRequest() from e_badreq class Response(ResponseBase):