{{ message }}
GH-106037: Disarm os.PathLike foot-shotgun in pathlib.PurePath user subclasses - #106043
Closed
barneygale wants to merge 1 commit into
Closed
barneygale wants to merge 1 commit into
barneygale wants to merge 1 commit into
Conversation
…os.PathLike` We made it possible to subclass `pathlib.PurePath` in a68e585, which landed in 3.12. However, user subclasses automatically inherit an `__fspath__()` method, which may not be appropriate. For example, a user subclass may implement a "virtual" filesystem to provide access to a `.zip` file or FTP server. But it would be highly surprising if `open(FTPPath(...))` attempted to open a *local* file. This patch makes the `os.PathLike` interface opt-in. In pathlib itself, we opt into the `os.PathLike` interface for `PurePosixPath`, `PureWindowsPath` and `Path`. As `PurePath` is not instantiable (you always get a `PurePosixPath` or `PureWindowsPath` object back), this is backwards compatible with 3.11, but not with earlier 3.12 betas.
AlexWaygood
reviewed
Jun 23, 2023
AlexWaygood
left a comment
Member
There was a problem hiding this comment.
Nice idea. Are we sure it's backwards compatible to remove __fspath__ from PurePath? Looks like there are a few user subclasses of it in the wild: https://github.com/pytest-dev/pyfakefs/blob/b576d65bbd9a7508c90e6b00aa3b9eccf4a86fa1/pyfakefs/fake_pathlib.py#L796-L805
One possible alternative solution might be to implement #106046, and then just document that users should set __fspath__ to None if they don't want their path subclasses to be considered subtypes of os.PathLike...?
Contributor
Author
Contributor
Author
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

We made it possible to subclass
pathlib.PurePathin a68e585, which landed in 3.12. However, user subclasses automatically inherit an__fspath__()method, which may not be appropriate. For example, a user subclass may implement a "virtual" filesystem to provide access to a.zipfile or FTP server. But it would be highly surprising ifopen(FTPPath(...))attempted to open a local file.This patch makes the
os.PathLikeinterface opt-in forpathlib.PurePathsubclasses. In pathlib itself, we opt into theos.PathLikeinterface forPurePosixPath,PureWindowsPathandPath. AsPurePathis not instantiable (you always get aPurePosixPathorPureWindowsPathobject back), this is backwards compatible with 3.11.pathlib.PurePathareos.PathLike#106037