-
-
Notifications
You must be signed in to change notification settings - Fork 29.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Namespace packages have inconsistent __file__ and __spec__.origin #76486
Comments
Along the lines of bpo-32303 there's another inconsistency in namespace package metadata. Let's say I have a namespace package: >>> importlib_resources.tests.data03.namespace
<module 'importlib_resources.tests.data03.namespace' (namespace)> The package has no __file__ attribute, and it has a misleading __spec__.origin >>> importlib_resources.tests.data03.namespace.__spec__.origin
'namespace'
>>> importlib_resources.tests.data03.namespace.__file__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'importlib_resources.tests.data03.namespace' has no attribute '__file__' This is especially bad because the documentation for __spec__.origin implies a correlation to __file__, and says: "Name of the place from which the module is loaded, e.g. “builtin” for built-in modules and the filename for modules loaded from source. Normally “origin” should be set, but it may be None (the default) which indicates it is unspecified." I don't particularly like that its origin is "namespace". That's an odd special case that's unhelpful to test against (what if you import a non-namespace package from the directory "namespace"?) What would break if __spec__.origin were (missing? or) None? |
3.5 is in security fix only mode, and this is not a security issue. |
Should this get an entry in the What's New? |
I guess it depends on whether you think this is a new feature or a bug fix. Or, OTOH, since we had to revert for 3.6, maybe it makes sense either way since some code will be affected. |
As is usual for me, I am here because some coverage.py code broke due to this change. A diff between b1 and b2 found me the code change (thanks for the comment, btw!), but a What's New doesn't seem out of place. |
On Mar 5, 2018, at 10:33, Ned Batchelder <report@bugs.python.org> wrote:
Sounds good; I’ll work up a PR |
@barry You gave 2 reasons for changing __spec__.origin and __file__ for namespace packages. Your 1st reason:
As far as I know, a non-namespace package always has an __init__.py file, so if it is imported from a directory named "namespace" it has a __spec__.origin and __file__ attributes equal to "path/to/package/namespace/init.py". So I don’t see the problem here with having a "namespace" origin for namespace package specs. In addition, PEP-420 that introduced implicit namespace packages in Python 3.3 clearly stated that having no __file__ attribute was intended for namespace packages, and more generally was left a the discretion of the module’s loader and no more limited to built-in modules (https://www.python.org/dev/peps/pep-0420/#module-reprs):
Your 2nd reason:
I agree here, so why not updating the documentation instead of changing the implementation which followed PEP-420? |
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:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: