Add various type annotations#8046
Conversation
|
FWIW I have some WIP type annotations for ImageFont and _imagingft here: main...nulano:Pillow:types-imagefont |
|
I think this is ready for review. The docs build might still fail, but I'd need help with that. |
|
Also, the pypy3.10 failure seems unrelated? |
|
Yeah, the PyPy one is a bit flaky. |
The error
is saying that the The way to solve this is by updating docs/reference/Image.rst to include it, by adding But given that our other protocols so far are |
Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com>
| self, | ||
| size: tuple[int, int], | ||
| image: Image.Image, | ||
| **options: dict[str, str | int | tuple[int, ...] | list[int]], |
There was a problem hiding this comment.
Could you explain why you made this change?
There was a problem hiding this comment.
The problem here is that options can be any of the remaining Image.transform arguments, i.e.:
resample: int = Resampling.NEAREST,
fill: int = 1,
fillcolor: float | tuple[float, ...] | str | None
dict is wrong in any case, but we could annotate it as float | tuple[float, ...] | str | None (with int being redundant with float), but that would imply that any argument could have that type. I see four alternatives:
- Don't bother and use
Any. - Use
float | tuple[float, ...] | str | Noneas that would prevent some typing errors, but not all (e.g.fill=(1,2,3)would not be caught), at the cost of a slightly misleading type hints. - Just replace
optionswith the actual forwarded arguments. (The option I would probably choose, as there are only three options.) - Use
Unpack, which means we would need to introduce a newTypedDictfor the arguments.
Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com>
|
I've created srittau#2 with various suggestions. |
| size = tuple(size) | ||
|
|
||
| self.load() | ||
| if box is None: | ||
| box = (0, 0) + self.size | ||
| else: | ||
| box = tuple(box) |
There was a problem hiding this comment.
@srittau @radarhere This change ended up being a breaking change for me when upgrading from 10.3.0 to 10.4.0 since .resize() previously would accept a numpy array as size. This now fails with an internal error message:
File "/usr/local/lib/python3.11/site-packages/PIL/Image.py", line 2297, in resize
if self.size == size and box == (0, 0) + self.size:
^^^^^^^^^^^^^^^^^
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()If this change was intentional I think it would be best to raise a nice error message or revert this and relax the input type requirements.
There was a problem hiding this comment.
#8201 has now restored the ability to use a NumPy array.
Changes proposed in this pull request:
Image,ImageFont,ImageDraw, and_imagingftmodules.