Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Handle pathlib.Path in FreeTypeFont#7578

Merged
radarhere merged 8 commits into
python-pillow:mainfrom
radarhere:font
Dec 6, 2023
Merged

Handle pathlib.Path in FreeTypeFont#7578
radarhere merged 8 commits into
python-pillow:mainfrom
radarhere:font

Conversation

@radarhere

Copy link
Copy Markdown
Member

Resolves #7577

Comment thread src/PIL/ImageFont.py
Comment thread src/PIL/ImageFont.py
@@ -213,6 +214,8 @@ def load_from_bytes(f):
)

if is_path(font):

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm looking at _util.is_path, it checks isinstance(f, (bytes, str, Path)), so bytes are also handled as paths, but next I see: else: load_from_bytes(font).

Do we really want consider bytes as paths? I believe this is obsolete in Python3

@radarhere radarhere Nov 28, 2023

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#258 was the original request for bytes as paths.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I assume load_from_bytes is unreachable here, so we need to remove it, or provide a way to reach it

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's reachable. The logic hasn't changed since load_from_bytes() was added in #3785.

If it is a path, then pass the path to the C layer. If we're on Windows and the path is not ASCII, then open a file pointer to the path and read the contents of the file pointer with load_from_bytes().
If it is not a path, then it is a file pointer, read the contents of the file pointer with load_from_bytes().

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I see. I believe there is misnaming here, since f is not a bytes, it's file object.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh right, I remember figuring that out after being confused in the past.
Should typing.BinaryIO be added to the type annotation then?

@radarhere radarhere Dec 4, 2023

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, I've pushed a commit. Testing in PyCharm, I find it also includes io.BytesIO

@nulano nulano Dec 27, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@radarhere I see you've used typing.IO. This causes a mypy error, see #7642.

Testing with both PyCharm and mypy, I find that a io.BytesIO value is accepted for a typing.BinaryIO type hint (which seems correct here), so I'm not sure I understand your last message.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think I was concerned about strings being used, but looking now, that doesn't appear to be a problem.

Comment thread src/PIL/ImageFont.py Outdated
Co-authored-by: Hugo van Kemenade <[email protected]>
Comment thread src/PIL/ImageFont.py Outdated
@radarhere radarhere merged commit e43dd66 into python-pillow:main Dec 6, 2023
@radarhere radarhere deleted the font branch December 6, 2023 01:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ImageFont.truetype() function does not accept Path objects

4 participants