summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrett Cannon <brett@python.org>2013-06-01 03:18:39 (GMT)
committerBrett Cannon <brett@python.org>2013-06-01 03:18:39 (GMT)
commit3e0651b5fa45031b858556292f5623e264addfd0 (patch)
treecbc860cfd294cb53ce0e37fa9dd320913054fad2
parent0e75c0688673da4fbaceae0b75e20e953751e86a (diff)
downloadcpython-3e0651b5fa45031b858556292f5623e264addfd0.zip
cpython-3e0651b5fa45031b858556292f5623e264addfd0.tar.gz
cpython-3e0651b5fa45031b858556292f5623e264addfd0.tar.bz2
Issue #18065: For frozen packages set __path__ to [].
Previously __path__ was set to [__name__], but that could lead to bad results if someone managed to circumvent the frozen importer and somehow ended up with a finder that thought __name__ was a legit directory/location.
-rw-r--r--Doc/whatsnew/3.4.rst7
-rw-r--r--Lib/test/test_importlib/frozen/test_loader.py2
-rw-r--r--Misc/NEWS6
-rw-r--r--Python/import.c6
4 files changed, 16 insertions, 5 deletions
diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst
index a659fc0..468ba1f 100644
--- a/Doc/whatsnew/3.4.rst
+++ b/Doc/whatsnew/3.4.rst
@@ -259,3 +259,10 @@ that may require changes to your code.
``__package__`` unconditionally to properly support reloading. If this is not
desired then you will need to set these attributes manually. You can use
:func:`importlib.util.module_to_load` for module management.
+
+* Import now resets relevant attributes (e.g. ``__name__``, ``__loader__``,
+ ``__package__``, ``__file__``, ``__cached__``) unconditionally when reloading.
+
+* Frozen packages no longer set ``__path__`` to a list containg the package name
+ but an empty list instead. Determing if a module is a package should be done
+ using ``hasattr(module, '__path__')``.
diff --git a/Lib/test/test_importlib/frozen/test_loader.py b/Lib/test/test_importlib/frozen/test_loader.py
index 4b8ec15..8731bdc 100644
--- a/Lib/test/test_importlib/frozen/test_loader.py
+++ b/Lib/test/test_importlib/frozen/test_loader.py
@@ -24,7 +24,7 @@ class LoaderTests(abc.LoaderTests):
module = machinery.FrozenImporter.load_module('__phello__')
check = {'__name__': '__phello__',
'__package__': '__phello__',
- '__path__': ['__phello__'],
+ '__path__': [],
'__loader__': machinery.FrozenImporter,
}
for attr, value in check.items():
diff --git a/Misc/NEWS b/Misc/NEWS
index 409d626..a90504f 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,12 @@ What's New in Python 3.4.0 Alpha 1?
Core and Builtins
-----------------
+- Issue #18065: Don't set __path__ to the package name for frozen packages.
+
+- Issue #18088: When reloading a module, unconditionally reset all relevant
+ attributes on the module (e.g. __name__, __loader__, __package__, __file__,
+ __cached__).
+
- Issue #17937: Try harder to collect cyclic garbage at shutdown.
- Issue #12370: Prevent class bodies from interfering with the __class__
diff --git a/Python/import.c b/Python/import.c
index a42b0f8..0bb46d2 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1107,19 +1107,17 @@ PyImport_ImportFrozenModuleObject(PyObject *name)
goto err_return;
}
if (ispackage) {
- /* Set __path__ to the package name */
+ /* Set __path__ to the empty list */
PyObject *d, *l;
int err;
m = PyImport_AddModuleObject(name);
if (m == NULL)
goto err_return;
d = PyModule_GetDict(m);
- l = PyList_New(1);
+ l = PyList_New(0);
if (l == NULL) {
goto err_return;
}
- Py_INCREF(name);
- PyList_SET_ITEM(l, 0, name);
err = PyDict_SetItemString(d, "__path__", l);
Py_DECREF(l);
if (err != 0)