Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

GH-128520: pathlib ABCs: improve protocol for 'openable' objects #134101

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
Loading
from

Conversation

barneygale
Copy link
Contributor

@barneygale barneygale commented May 16, 2025

Rename pathlib._os.magic_open() to vfsopen(). The new name is a bit less abstract, and it aligns with the vfspath() method added in 5dbd27d.

Per discussion on discourse1, adjust vfsopen() so that the following methods may be called:

  • __open_reader__()
  • __open_writer__(mode)
  • __open_updater__(mode)

These three methods return readable, writable, and full duplex file objects respectively. In the 'writer' method, mode is either 'a', 'w' or 'x'. In the 'updater' method, mode is either 'r' or 'w'.

Also stop trying built-in open() first. I don't know whether this is a good idea or not, so it's best to leave it out for now.

In the pathlib ABCs, replace ReadablePath.__open_rb__() with __open_reader__(), and replace WritablePath.__open_wb__() with __open_writer__().

Footnotes

  1. https://discuss.python.org/t/open-able-objects/90238

Rename `pathlib._os.magic_open()` to `vfsopen()`. The new name is a bit
less abstract, and it aligns with the `vfspath()` method added in 5dbd27d.

Per discussion on discourse[^1], adjust `vfsopen()` so that the following
methods may be called:

- `__open_reader__()`
- `__open_writer__(mode)`
- `__open_updater__(mode)`

These three methods return readable, writable, and full duplex file objects
respectively. In the 'writer' method, *mode* is either 'a', 'w' or 'x'. In
the 'updater' method, *mode* is either 'r' or 'w'.

Also stop trying built-in `open()` first. I don't know whether this is a
good idea or not, so it's best to leave it out for now.

In the pathlib ABCs, replace `ReadablePath.__open_rb__()` with
`__open_reader__()`, and replace `WritablePath.__open_wb__()` with
`__open_writer__()`.

[^1]: https://discuss.python.org/t/open-able-objects/90238
@barneygale barneygale marked this pull request as ready for review May 16, 2025 18:11
Comment on lines +171 to +176
try:
return cls.__open_reader__(obj)
except AttributeError:
if hasattr(cls, '__open_reader__'):
raise
raise TypeError(f"{cls.__name__} can't be opened for reading")
Copy link
Member

Choose a reason for hiding this comment

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

try should contain only the operation operation that can fail (.):

Suggested change
try:
return cls.__open_reader__(obj)
except AttributeError:
if hasattr(cls, '__open_reader__'):
raise
raise TypeError(f"{cls.__name__} can't be opened for reading")
try:
open_reader = cls.__open_reader__
except AttributeError:
raise TypeError(f"{cls.__name__} can't be opened for reading")
else:
return open_reader(obj)

"""
Open the file pointed to by this path and return a file object, as
the built-in open() function does.

Unlike the built-in open() function, this function accepts 'openable'
objects, which are objects with any of these magic methods:
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
objects, which are objects with any of these magic methods:
objects, which are objects with any of these special methods:

See the glossary.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants
Morty Proxy This is a proxified and sanitized view of the page, visit original site.