You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[doc] Explicitly note that meta_path is not empty #74720
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=Noneclosed_at=Nonecreated_at=<Date2017-06-01.08:59:10.759>labels= ['easy', 'type-bug', '3.9', '3.10', '3.11', 'docs']
title='[doc] Explicitly note that meta_path is not empty'updated_at=<Date2021-11-26.23:16:18.508>user='https://github.com/masklinn'
Encountered this issue porting Python 2 code manipulating meta_path to Python 3.
In Python 2, meta_path is empty by default and its documentation specifically notes that:
sys.meta_path is searched before any implicit default finders or sys.path.
As a result, sys.meta_path.append() works perfectly well and is overwhelmingly common[0].
In Python 3, this note was removed but the documentation does not specifically state default finders are present in meta_path, and the old code using sys.meta_path.append may now break as the default finders will silently take precedence on the custom ones if they believe they can do the job.
I'd like to add a warning to the Python 3 documentation (3.5+?) noting the presence of existing default loaders, and to the Python 2 documentation suggesting sys.meta_path.insert(0, finder) for future-proofing, would there be objections or issues?
Addendum: the warning was present (in the documentation) until Python 3.5, even though Python 3.3 is apparently where the "default finders" were moved to meta_path:
And it turns out the change was noted in the Python 3.3 release notes[0] though not all the consequences were spelled out (and the meta_path and path_hooks documentations were not changed)
I'm fine with adding a note to the Python 2 docs, but putting it in Python 3 seems to be going in the wrong direction as having sys.meta_path not be empty is how Python will be going forward.
masklinn commented on Jun 2, 2017
masklinnmannequin
MannequinAuthor
More actions
I'm fine with adding a note to the Python 2 docs, but putting it in Python 3 seems to be going in the wrong direction as having sys.meta_path not be empty is how Python will be going forward.
I don't think putting a note is any hint that the Python 3 behaviour (which I appreciate) would change, it would simply tell the reader that the list is not empty by default and they ought decide whether they want their finders to take precedence over (and insert at head) or be fallback to (and append) the builtin finders.
It could also link to the standard/builtin finders.
masklinn commented on Jun 2, 2017
masklinnmannequin
MannequinAuthor
More actions
A warning is probably too strong. Also, it's easy to check sys.meta_path at the interpreter prompt, so I'm not sure it's worth mentioning at all.
It's easy if you think of it and did not miss a small bit of the Python 3.3 release note indicating that the *documented guarantees* of Python 2.x, 3.0, 3.1 and 3.2 had been dropped, even as they were incorrectly still present in the official documentation itself.
I spent a few hours trying to understand why our import hooks did not work correctly anymore in 3.5, and I never even considered printing sys.meta_path in an open interpreter, I realised the behavioural change because I ended up printing meta_path after the addition of our custom hooks to make sure they were actually there.
I spent a few hours trying to understand why our import hooks did not work correctly anymore in 3.5, and I never even considered printing sys.meta_path in an open interpreter, I realised the behavioural change because I ended up printing meta_path after the addition of our custom hooks to make sure they were actually there.
Fair enough. So we can just add a sentence informing readers that meta_path, by default, holds entries to handle the standard kinds of
modules (.py files, extension modules...).
masklinn commented on Jun 2, 2017
masklinnmannequin
MannequinAuthor
More actions
Fair enough. So we can just add a sentence informing readers that meta_path, by default, holds entries to handle the standard kinds of
modules (.py files, extension modules…).
Yeah that's basically what I meant, talking about a "warning" in python 3 may have been the wrong wording or given an incorrect impression, sorry about that.
Yeah, there's actually a specific 'warning' directive which puts text in the docs in a red box to make it a full-blown warning which is what I thought you wanted, having it say "this is different than Python 2!". Having a sentence that just states how things are without referring to Python 2 is totally fine.
I think this is actually both important enough and subtle enough to warrant a ".. note::" callout in the docs.
In Python 3, it would say to use sys.meta_path.insert(0, finder) if you want your finder to take precedence over the default search locations, and sys.meta_path.append(finder) if you only want it handle cases that aren't already handled by the default machine.
In Python 2, it would say that custom finders on sys.meta_path will always take precedence over the default machinery, and if you want to do otherwise, you'll need to use importlib2 and install its loaders into sys.meta_path ahead of your own.
Activity
masklinn commentedon Jun 1, 2017
Encountered this issue porting Python 2 code manipulating meta_path to Python 3.
In Python 2, meta_path is empty by default and its documentation specifically notes that:
As a result, sys.meta_path.append() works perfectly well and is overwhelmingly common[0].
In Python 3, this note was removed but the documentation does not specifically state default finders are present in meta_path, and the old code using sys.meta_path.append may now break as the default finders will silently take precedence on the custom ones if they believe they can do the job.
I'd like to add a warning to the Python 3 documentation (3.5+?) noting the presence of existing default loaders, and to the Python 2 documentation suggesting
sys.meta_path.insert(0, finder)for future-proofing, would there be objections or issues?[0] https://github.com/search?q=meta_path.append&type=Code&utf8=✓
masklinn commentedon Jun 1, 2017
Addendum: the warning was present (in the documentation) until Python 3.5, even though Python 3.3 is apparently where the "default finders" were moved to meta_path:
masklinn commentedon Jun 1, 2017
And it turns out the change was noted in the Python 3.3 release notes[0] though not all the consequences were spelled out (and the meta_path and path_hooks documentations were not changed)
[0] https://docs.python.org/3/whatsnew/3.3.html#visible-changes
pitrou commentedon Jun 1, 2017
A warning is probably too strong. Also, it's easy to check sys.meta_path at the interpreter prompt, so I'm not sure it's worth mentioning at all.
brettcannon commentedon Jun 1, 2017
I'm fine with adding a note to the Python 2 docs, but putting it in Python 3 seems to be going in the wrong direction as having sys.meta_path not be empty is how Python will be going forward.
masklinn commentedon Jun 2, 2017
I don't think putting a note is any hint that the Python 3 behaviour (which I appreciate) would change, it would simply tell the reader that the list is not empty by default and they ought decide whether they want their finders to take precedence over (and insert at head) or be fallback to (and append) the builtin finders.
It could also link to the standard/builtin finders.
masklinn commentedon Jun 2, 2017
It's easy if you think of it and did not miss a small bit of the Python 3.3 release note indicating that the *documented guarantees* of Python 2.x, 3.0, 3.1 and 3.2 had been dropped, even as they were incorrectly still present in the official documentation itself.
I spent a few hours trying to understand why our import hooks did not work correctly anymore in 3.5, and I never even considered printing sys.meta_path in an open interpreter, I realised the behavioural change because I ended up printing meta_path after the addition of our custom hooks to make sure they were actually there.
pitrou commentedon Jun 2, 2017
Le 02/06/2017 à 13:21, Xavier Morel a écrit :
Fair enough. So we can just add a sentence informing readers that
meta_path, by default, holds entries to handle the standard kinds ofmodules (.py files, extension modules...).
masklinn commentedon Jun 2, 2017
Yeah that's basically what I meant, talking about a "warning" in python 3 may have been the wrong wording or given an incorrect impression, sorry about that.
brettcannon commentedon Jun 2, 2017
Yeah, there's actually a specific 'warning' directive which puts text in the docs in a red box to make it a full-blown warning which is what I thought you wanted, having it say "this is different than Python 2!". Having a sentence that just states how things are without referring to Python 2 is totally fine.
ncoghlan commentedon Jun 3, 2017
s/Warn/Explicitly note/ in the issue title :)
I think this is actually both important enough and subtle enough to warrant a ".. note::" callout in the docs.
In Python 3, it would say to use
sys.meta_path.insert(0, finder)if you want your finder to take precedence over the default search locations, andsys.meta_path.append(finder)if you only want it handle cases that aren't already handled by the default machine.In Python 2, it would say that custom finders on
sys.meta_pathwill always take precedence over the default machinery, and if you want to do otherwise, you'll need to useimportlib2and install its loaders intosys.meta_pathahead of your own.[-]Warn that meta_path is not empty[/-][+]Explicitly note that meta_path is not empty[/+]Windsooon commentedon May 14, 2019
I created a PR for it. TBO, meta_path is not a good name since it doesn't contain any *path* at all.
[-]Explicitly note that meta_path is not empty[/-][+][doc] Explicitly note that meta_path is not empty[/+]