GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — GH-76846, GH-85281: Call `__new__()` and `__init__()` on pathlib subclasses by barneygale · Pull Request #102789 · python/cpython

Conversation

@barneygale

@barneygale barneygale commented Mar 17, 2023 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

This PR fixes an issue where __new__() and __init__() were not called on subclasses of pathlib.PurePath and Path in some circumstances.

Specifically, the _from_parsed_parts() constructor -- which is used when iterating directories, parents, and in with_name() and friends -- has been altered as follows:

diff --git a/Lib/pathlib.py b/Lib/pathlib.py
index 55c44f12e5..c9b45ddbfa 100644
--- a/Lib/pathlib.py
+++ b/Lib/pathlib.py
@@ -310,7 +310,9 @@ def _from_parts(cls, args):
 
     @classmethod
     def _from_parsed_parts(cls, drv, root, parts):
-        self = object.__new__(cls)
+        path = cls._format_parsed_parts(drv, root, parts)
+        self = cls(path)
+        self._str = path or '.'
         self._drv = drv
         self._root = root
         self._parts = parts

This change alone has an unfortunate effect: paths constructed this way are re-parsed and re-normalized even though we have the fully normalized path at hand.

To fix this, we change the main constructor to not normalize paths. Instead, paths are normalized on-demand. This also speeds up path construction, p.joinpath(q), and p / q.

  • Issue: pathlib.Path._from_parsed_parts should call cls.__new__(cls) #76846
  • Issue: subclasses of pathlib.PurePosixPath never call __init__ or __new__ #85281

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

CAM-Gerlach and Jacob-Flasheye reacted with hooray emoji
All reactions
  • 🎉 2 reactions
barneygale added 3 commits March 17, 2023 18:56
@barneygale
Call cls.__new__() from PurePath._from_parsed_parts()
3aee8a6
@barneygale
Defer path normalization
36f949e
@barneygale
Add news blurb.
e54b4cb
@barneygale barneygale added the topic-pathlib label Mar 17, 2023
@bedevere-bot bedevere-bot mentioned this pull request Mar 17, 2023
pathlib.Path._from_parsed_parts should call cls.__new__(cls) #76846
Closed
@bedevere-bot bedevere-bot added the awaiting review label Mar 17, 2023
@barneygale barneygale mentioned this pull request Mar 17, 2023
GH-101362: Optimise pathlib by deferring path normalisation #101560
Closed
@barneygale
barneygale marked this pull request as ready for review March 17, 2023 19:51
barneygale added 3 commits March 17, 2023 21:23
@barneygale
Fix str(Path('foo').parent)
b8842db
@barneygale
Make pickling cheaper
32d13ba
@barneygale
Revert "Make pickling cheaper"
0524417
This reverts commit 32d13ba.
@barneygale barneygale mentioned this pull request Mar 24, 2023
GH-78079: Fix UNC device path root normalization in pathlib #102003
Merged
zooba
zooba reviewed Mar 27, 2023
View reviewed changes

@zooba zooba left a comment

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

LGTM (with what I marked). Any concerns in particular that you'd like me to take a closer look at?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

barneygale reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
Comment thread Lib/pathlib.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/pathlib.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/pathlib.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/pathlib.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

@barneygale @zooba
Apply suggestions from code review
e54a687
Co-authored-by: Steve Dower <[email protected]>
barneygale
barneygale commented Mar 27, 2023
View reviewed changes
Comment thread Lib/pathlib.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

barneygale
barneygale commented Mar 27, 2023
View reviewed changes
Comment thread Lib/test/test_pathlib.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

barneygale added 2 commits March 27, 2023 20:56
@barneygale
Use object.__new__(cls) to construct
1c155de
@barneygale
Tests: use path class to join parts in _check_parse_parts()
5cc6e13
@barneygale

barneygale commented Mar 27, 2023

Copy link
Copy Markdown
Contributor Author

I think those were my only areas of concern! Thanks for the review :)

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@barneygale

barneygale commented Apr 3, 2023

Copy link
Copy Markdown
Contributor Author

Are you happy for me to merge, @zooba?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@zooba

zooba commented Apr 3, 2023

Copy link
Copy Markdown
Member

All yours :shipit:

barneygale reacted with hooray emoji
All reactions
  • 🎉 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@barneygale
barneygale merged commit 11c3020 into python:main Apr 3, 2023
@bedevere-bot bedevere-bot removed the awaiting review label Apr 3, 2023
@barneygale barneygale mentioned this pull request Apr 3, 2023
subclasses of pathlib.PurePosixPath never call __init__ or __new__ #85281
Closed
@terryjreedy terryjreedy mentioned this pull request Apr 3, 2023
bpo-41109: subclasses of pathlib.Path and pathlib.PurePath now call the subclass's __init__() and __new__() functions when returning new objects #21920
Closed
This was referenced Apr 3, 2023
GH-100479: Add optional blueprint argument to pathlib.PurePath #100481
Closed
Support for sharing state between pathlib subclasses #100479
Closed
gaogaotiantian pushed a commit to gaogaotiantian/cpython that referenced this pull request Apr 8, 2023
@barneygale @zooba @gaogaotiantian
pythonGH-76846, pythonGH-85281: Call __new__() and __init__() on …
2658fae
…pathlib subclasses (pythonGH-102789)

Fix an issue where `__new__()` and `__init__()` were not called on subclasses of `pathlib.PurePath` and `Path` in some circumstances.

Paths are now normalized on-demand. This speeds up path construction, `p.joinpath(q)`, and `p / q`.

Co-authored-by: Steve Dower <[email protected]>
warsaw pushed a commit to warsaw/cpython that referenced this pull request Apr 11, 2023
@barneygale @zooba @warsaw
pythonGH-76846, pythonGH-85281: Call __new__() and __init__() on …
ecd5328
…pathlib subclasses (pythonGH-102789)

Fix an issue where `__new__()` and `__init__()` were not called on subclasses of `pathlib.PurePath` and `Path` in some circumstances.

Paths are now normalized on-demand. This speeds up path construction, `p.joinpath(q)`, and `p / q`.

Co-authored-by: Steve Dower <[email protected]>
@CAM-Gerlach CAM-Gerlach mentioned this pull request May 25, 2023
pathlib: Where does "self._flavour" comes from? (3.11 to 3.12 migration) #104921
Closed
@coderabbitai coderabbitai Bot mentioned this pull request Aug 10, 2026
refactor(auth): extract storage object model and migrate callers teng-lin/notebooklm-py#2171
Merged
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@zooba zooba zooba left review comments

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

topic-pathlib

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

3 participants

@barneygale @zooba @bedevere-bot
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.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.