GH-89812: Add pathlib._PathBase#106337
Conversation
|
@brettcannon a long time ago in a PR far, far away, you said:
I couldn't make this work for So in this PR I've chosen However, I have a bunch of open questions in the PR description about how These questions make me think that Do you have any advice on the best way forward? Thanks! |
Sorry, something went wrong.
You have a couple of options:
|
Sorry, something went wrong.
|
I am unsure about the name VirtualPath! The way I’ve seen it used, a TarPath class, or SshPath, or S3Path would be examples of virtual filesystems: I give them paths that look like regular filesystem paths and they do custom operations to return info or data. Their base class is not itself a virtual path, it’s an (abstract?) base class! |
Sorry, something went wrong.
|
Fair point! How about |
Sorry, something went wrong.
|
Alternatively, |
Sorry, something went wrong.
|
Not a fan of deep modules, and even |
Sorry, something went wrong.
We actually used to have accessor objects, but their interface was much the same as If we add accessors back in, most users would need to subclass two classes to implement their own path objects: the accessor class and the path class. The latter would be necessary for any user who wants to add their own path methods, for example. |
Sorry, something went wrong.
|
those "accessors" where nothing more than aliases, after all the implementation as done had no power over what the pure path portion can do with the real world a actualy "accessor" would be able to be tied to something like a directory file descriptor, or a path object, or a entirely different thing thats not a filesystem and yes there is some need for synchronization between concrete path capabilities and the accessors, however there is certain equivalence classes to keep in mind (Posix, Windows), so in a lot of cases my impression is that there will be more "accessors" than paths |
Sorry, something went wrong.
|
Intriguing. Could you sketch out the accessor API? |
Sorry, something went wrong.
|
(in the forums rather than a PR discussion please) |
Sorry, something went wrong.
|
i can dedicate some time to it later a basic concept of the accessor version ought to consider something like:
|
Sorry, something went wrong.
|
To summarise my thoughts on the above: in many cases this PR helps bring those things about, and I don't think it hinders any of those things. But let's chat more in a forum thread. What's left in this PR:
On the latter point, there are still two subtle and related problems:
Both of these issues could be solved if we can provide some way to
|
Sorry, something went wrong.
|
Bah, pushed a commit labelled "WIP". In fact it contains a solution to the above problem: stash a |
Sorry, something went wrong.
This will require further refactoring in another PR.
|
Hey @AA-Turner and @gst, thank you for your earlier reviews, very much appreciated. Please could you give it another pass, if you can spare the time? I feel OK about |
Sorry, something went wrong.
AA-Turner
left a comment
There was a problem hiding this comment.
Thanks! Just two notes. I think _split_stack makes sense a method.
A
Sorry, something went wrong.
|
Thank you so much for the reviews, everyone :-) |
Sorry, something went wrong.
|
Congratulations Barney, a lot of hard work on your part paid off! A |
Sorry, something went wrong.
Add private `pathlib._PathBase` class. This will be used by an experimental PyPI package to incubate a `tarfile.TarPath` class. Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
Add private
pathlib._PathBaseclass. This will be used by an experimental PyPI package to incubate atarfile.TarPathclass.Implementation notes
In
pathlib.py:Pathinto_PathBaseandPath_PathBase.is_junction()andis_mount()usingstat(). In the latter case, restore the implementation deleted in gh-86943: implementpathlib.WindowsPath.is_mount()#31458_PathBase.resolve()usingabsolute()andreadlink()_PathBase._scandir()usingiterdir()In
test_pathlib.py:PathBaseTestto exercise the_PathBaseclass directlyPathTestintoDummyPathTestandPathTest. The former exercises a representative subclass of_PathBase.DummyPathWithSymlinksTestto exercise a similar subclass, this time with symlink support.Questionable bits
In
pathlib.py, the_PathBase.is_junction()and_PathBase.resolve()methods are new code. The latter is very performance-sensitive and may need more work.Future work
pathlib._PathBasepublic. There's still at least a couple of things to do first:MakePurePath._flavourpublic_PathBase.__hash__(),__eq__(), and other comparison methods.