diff --git a/CHANGES.rst b/CHANGES.rst index 985c8a0d..7e8d7343 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -6,6 +6,7 @@ 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 in ``src/flask/app.py``. :issue:`5543` Version 3.0.3 ------------- diff --git a/src/flask/app.py b/src/flask/app.py index 53eb602c..c59e207c 100644 --- a/src/flask/app.py +++ b/src/flask/app.py @@ -7,6 +7,7 @@ import typing as t import weakref from datetime import timedelta from inspect import iscoroutinefunction +from io import BufferedReader from itertools import chain from types import TracebackType from urllib.parse import quote as _url_quote @@ -322,7 +323,7 @@ class Flask(App): def open_resource( self, resource: str, mode: str = "rb", encoding: str | None = None - ) -> t.IO[t.AnyStr]: + ) -> t.IO[t.AnyStr] | BufferedReader: """Open a resource file relative to :attr:`root_path` for reading. For example, if the file ``schema.sql`` is next to the file @@ -1167,17 +1168,20 @@ class Flask(App): # unpack tuple returns if isinstance(rv, tuple): - len_rv = len(rv) - # a 3-tuple is unpacked directly - if len_rv == 3: - rv, status, headers = rv # type: ignore[misc] + if len(rv) == 3: + rv, status, headers = rv # decide if a 2-tuple has status or headers - elif len_rv == 2: - if isinstance(rv[1], (Headers, dict, tuple, list)): - rv, headers = rv + elif len(rv) == 2: + rv0 = rv[0] + rv1 = rv[1] + if isinstance(rv1, (Headers, dict, tuple, list)): + rv = rv0 + headers = rv1 else: - rv, status = rv # type: ignore[assignment,misc] + rv = rv0 + if isinstance(rv1, int): + status = rv1 # other sized tuples are not allowed else: raise TypeError(