Open alicederyn opened 2 months ago
Hi @alicederyn - Can you include a minimally reproducible example?
Sure! Take this for instance:
from jinja2 import Environment, FileSystemLoader
def simple_repro() -> None:
environment = Environment(loader=FileSystemLoader("."))
with open("foo.txt", "w") as output:
environment.get_template("foo.txt.jinja").stream(person="Stefanie").dump(output)
with the following in foo.txt.jinja
:
Hi {{person}}!
This runs fine, but mypy complains that:
repro.py:6: error: Argument 1 to "dump" of "TemplateStream" has incompatible type "TextIOWrapper"; expected "str | IO[bytes]" [arg-type]
Changing the open call to open("foo.txt", "wb")
makes mypy happy as output
is now an IO[bytes]
, but at runtime the call to dump fails:
> real_fp.writelines(iterable)
E TypeError: a bytes-like object is required, not 'str'
opt/bb/lib/python3.11/site-packages/jinja2/environment.py:1626: TypeError
(It shouldn't matter, but this is python 3.11, jinja2 3.1.4, and mypy 1.10.0.)
This PR changed the hint for dump from
IO
toIO[bytes]
: https://github.com/pallets/jinja/pull/1968However, I believe if
encoding
is not provided (or explicitlyNone
), this should beIO[str]
? I certainly get a runtime error (TypeError: a bytes-like object is required, not 'str'
) if I try to change my code to pass in anIO[bytes]
to satisfy mypy, while the code works fine at runtime if I just# type: ignore
the new mypy errors.I believe the type hint needs to change to an
@overload
: