Repository navigation
Direct sub-classing of pathlib.Path #68320
Copy link
Copy link
Closed
Labels
3.11only security fixesonly security fixesstdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytopic-pathlibtype-featureA feature request or enhancementA feature request or enhancement
Description
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee = None
closed_at = None
created_at = <Date 2015-05-06.05:26:53.017>
labels = ['type-feature', 'library', '3.11']
title = 'Direct sub-classing of pathlib.Path'
updated_at = <Date 2022-03-09.23:54:09.299>
user = 'https://bugs.python.org/projetmbc'bugs.python.org fields:
activity = <Date 2022-03-09.23:54:09.299>
actor = 'barneygale'
assignee = 'none'
closed = False
closed_date = None
closer = None
components = ['Library (Lib)']
creation = <Date 2015-05-06.05:26:53.017>
creator = 'projetmbc'
dependencies = []
files = []
hgrepos = []
issue_num = 24132
keywords = ['patch']
message_count = 28.0
messages = ['242643', '242651', '242656', '242657', '242689', '242696', '242699', '242700', '242701', '242702', '242703', '242705', '246007', '305799', '305811', '305827', '305830', '305918', '310634', '314561', '314582', '314625', '365277', '381321', '392695', '401946', '412354', '414821']
nosy_count = 15.0
nosy_names = ['paul.moore', 'pitrou', 'bronger', 'elguavas', 'piotr.dobrogost', 'Kevin.Norris', 'projetmbc', 'keithy', 'qb-cea', 'miss-islington', 'FFY00', 'barneygale', 'Xtrem532', 'nyuszika7h', 'kfollstad']
pr_nums = ['6248', '25240', '25271', '25701', '26141', '26438', '26708', '26906', '31085', '31691']
priority = 'normal'
resolution = None
stage = 'patch review'
status = 'open'
superseder = None
type = 'enhancement'
url = 'https://bugs.python.org/issue24132'
versions = ['Python 3.11']Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
3.11only security fixesonly security fixesstdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytopic-pathlibtype-featureA feature request or enhancementA feature request or enhancement
Activity
projetmbc commentedon May 6, 2015
Hello.
I have noticed a problem with the following code.
This gives the following error message.
This breaks the sub-classing from Python point of view.
There is an ugly hack to sub-class Path but it's a bit unpythonic.
[-]Direct sub-classing of pathless.Path[/-][+]Direct sub-classing of pathlib.Path[/+]pfmoore commentedon May 6, 2015
One issue with your code - what would you expect str(test) to produce? "dir/test.txt" or "dir\test.txt"? That's the point of the "flavour" - is it a Windows path or a Unix path?
Agreed that an easier method of creating Path subclasses that handle this type of thing would be useful, but any solution needs to make sure that developers don't overlook the Windows vs Unix implications.
Can you give an actual use case (as opposed to the toy example)?
pitrou commentedon May 6, 2015
The Path classes were not designed to be subclassable by the user.
I'm not against making subclassing easier, but someone will have to propose a viable approach for that.
projetmbc commentedon May 6, 2015
Hello.
I will give a real example in 5 hours after my job. I will try tomorrow a
solution to ease the subclassing using another dedicazted class PathPlus,
sorry for the name. The idea would be to use this new class for
customization, and also to define WindowsPath and PosixPath sub-classing
this new class. By default PathPlus would be an empty class. I do not know
if this works well. Maybe my idea is a bad one.
*Christophe BAL*
*Enseignant de mathématiques en Lycée **et développeur Python amateur*
*---*
*French math teacher in a "Lycée" **and **Python **amateur developer*
2015-05-06 13:05 GMT+02:00 Antoine Pitrou <report@bugs.python.org>:
projetmbc commentedon May 6, 2015
Here are for example two extra methods that I have implemented.
python::
from mistool import os_use
*Christophe BAL*
*Enseignant de mathématiques en Lycée **et développeur Python amateur*
*---*
*French math teacher in a "Lycée" **and **Python **amateur developer*
2015-05-06 14:13 GMT+02:00 Christophe BAL <report@bugs.python.org>:
pfmoore commentedon May 6, 2015
For that type of function, I'd suggest you use a standalone function rather than subclassing and methods or operator overloading. You don't gain enough to be worth the complexity of having to subclass path objects. And duck typing means that your function works for any subclass of (Pure)Path without change.
projetmbc commentedon May 6, 2015
I don't agree with you. I prefer to add new functionalities to the paths I
use. This is the power of OOP. It is easier and cleaner to use
*mypath.common_with(otherpath)* than *common_with(*mypath, **other path)
.
Python is highly OOP, so you can't say *"don't use subclassing in your
case"*. As a user, I should have the possibility to use the method I want.
Another example is the use of *onepath - anotherpath* instead of
*onepath.relative_to(*another path) . That's the power of the magic
method to add this kind of feature.
*Christophe BAL*
*Enseignant de mathématiques en Lycée **et développeur Python amateur*
*---*
*French math teacher in a "Lycée" **and **Python **amateur developer*
2015-05-06 20:21 GMT+02:00 Paul Moore <report@bugs.python.org>:
pfmoore commentedon May 6, 2015
I have no problem with that - it's a style choice certainly.
As I said, I'd like to see simpler subclassing of pathlib objects. I just think it'll be quite hard to do (given the complexities of classes for Windows/Unix as well as pure and concrete paths). So if it's just about examples like this, I personally would take the easier route and just go with standalone functions. If someone else felt strongly enough to design and implement a subclassing solution, that's fine though.
projetmbc commentedon May 6, 2015
Are you the author of path lib ?
*Christophe BAL*
*Enseignant de mathématiques en Lycée **et développeur Python amateur*
*---*
*French math teacher in a "Lycée" **and **Python **amateur developer*
2015-05-06 21:01 GMT+02:00 Paul Moore <report@bugs.python.org>:
pfmoore commentedon May 6, 2015
Nope, that's Antoine.
projetmbc commentedon May 6, 2015
OK.
I will try to find a way to achieve an easier and cleaner way to sub class
pathlib.Path and co.
What is the good way to propose a patch ?
*Christophe BAL*
*Enseignant de mathématiques en Lycée **et développeur Python amateur*
*---*
*French math teacher in a "Lycée" **and **Python **amateur developer*
2015-05-06 21:09 GMT+02:00 Paul Moore <report@bugs.python.org>:
pfmoore commentedon May 6, 2015
If you have a patch, attach it here, and it will get reviewed.
KevinNorris commentedon Jul 1, 2015
If I were designing pathlib from scratch, I would not have a separate Path class. I would instead do something like this:
In pathlib.py:
Alternatively, Path() could be a factory function that picks one of those classes at runtime.
Of course, that still leaves the issue of where to put the method implementations which currently live in Path. We could change the name of Path to _Path and use the code above to continue providing a Path alias, but that might be too confusing. Another possibility is to pull those methods out into top-level functions and then alias them into methods in WindowsPath and PosixPath (perhaps using a decorator-like-thing to pass the flavor, instead of attaching it to the class).
The main thing, though, is that Path should not depend on its subclasses. That really strikes me as poor design, since it produces issues like this one.
13 remaining items
barneygale commentedon May 2, 2021
Progress report:
I've been working on tidying up the pathlib internals over the 3.9 and 3.10 releases. We're now in a position where:
pathlib._Flavouris entirely pure, and doesn't make anyoscallspathlib._Accessorhandles allosaccess.The internal abstractions are now much tighter, which allows us to begin refactoring them with confidence!
The next step is to remove accessors, in bpo-43012.
After that I'll finally be in a position to start working on this bug!
nyuszika7h commentedon Sep 16, 2021
I agree this would be nice. For now, I'm doing this as a hack:
miss-islington commentedon Feb 2, 2022
New changeset 08f8301 by Barney Gale in branch 'main':
bpo-43012: remove
pathlib._Accessor(GH-25701)08f8301
barneygale commentedon Mar 9, 2022
If/when python/issues-test-cpython#31691 lands, I think this bug can be resolved: the original repro case will no longer raise AttributeError, and subclasses will be able to customize behaviour without needing to define further "flavour" or "accessor" subclasses.
gh-68320, gh-88302 - Allow for private `pathlib.Path` subclassing (GH…
Merged main into regmachine branch (#50)
mzipay commentedon Apr 6, 2023
Sorry if I'm "late to the party," but ALL of the discussion from non-mannequins seems (to me) to miss the point entirely.
The
pathlibmodule fails (grossly, IMO) to respect two key "Pythonic" principles:#. If the implementation is hard to explain, it's a bad idea.