summaryrefslogtreecommitdiffstats
path: root/Doc
diff options
context:
space:
mode:
authorBrett Cannon <brett@python.org>2013-05-04 17:56:58 (GMT)
committerBrett Cannon <brett@python.org>2013-05-04 17:56:58 (GMT)
commit4c14b5de1cf372e963a4378fc6cb2bca36d24eb8 (patch)
treec3d96e142fa3166f582414beeb53fd9792599345 /Doc
parent4cfc0b5411354323433031b5e03862def2f00234 (diff)
downloadcpython-4c14b5de1cf372e963a4378fc6cb2bca36d24eb8.zip
cpython-4c14b5de1cf372e963a4378fc6cb2bca36d24eb8.tar.gz
cpython-4c14b5de1cf372e963a4378fc6cb2bca36d24eb8.tar.bz2
#17115,17116: Have modules initialize the __package__ and __loader__
attributes to None. The long-term goal is for people to be able to rely on these attributes existing and checking for None to see if they have been set. Since import itself sets these attributes when a loader does not the only instances when the attributes are None are from someone overloading __import__() and not using a loader or someone creating a module from scratch. This patch also unifies module initialization. Before you could have different attributes with default values depending on how the module object was created. Now the only way to not get the same default set of attributes is to circumvent initialization by calling ModuleType.__new__() directly.
Diffstat (limited to 'Doc')
-rw-r--r--Doc/c-api/module.rst11
-rw-r--r--Doc/library/importlib.rst2
-rw-r--r--Doc/reference/import.rst4
-rw-r--r--Doc/whatsnew/3.4.rst5
4 files changed, 17 insertions, 5 deletions
diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst
index 65ff8fa..95a0169 100644
--- a/Doc/c-api/module.rst
+++ b/Doc/c-api/module.rst
@@ -35,13 +35,20 @@ There are only a few functions special to module objects.
single: __name__ (module attribute)
single: __doc__ (module attribute)
single: __file__ (module attribute)
+ single: __package__ (module attribute)
+ single: __loader__ (module attribute)
Return a new module object with the :attr:`__name__` attribute set to *name*.
- Only the module's :attr:`__doc__` and :attr:`__name__` attributes are filled in;
- the caller is responsible for providing a :attr:`__file__` attribute.
+ The module's :attr:`__name__`, :attr:`__doc__`, :attr:`__package__`, and
+ :attr:`__loader__` attributes are filled in (all but :attr:`__name__` are set
+ to ``None``); the caller is responsible for providing a :attr:`__file__`
+ attribute.
.. versionadded:: 3.3
+ .. versionchanged:: 3.4
+ :attr:`__package__` and :attr:`__loader__` are set to ``None``.
+
.. c:function:: PyObject* PyModule_New(const char *name)
diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst
index aeeb3fd..9cb03be 100644
--- a/Doc/library/importlib.rst
+++ b/Doc/library/importlib.rst
@@ -827,7 +827,7 @@ an :term:`importer`.
decorator as it subsumes this functionality.
.. versionchanged:: 3.4
- Set ``__loader__`` if set to ``None`` as well if the attribute does not
+ Set ``__loader__`` if set to ``None``, as if the attribute does not
exist.
diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst
index 4ad4490..9c52435 100644
--- a/Doc/reference/import.rst
+++ b/Doc/reference/import.rst
@@ -423,8 +423,8 @@ Here are the exact rules used:
* If the module has a ``__file__`` attribute, this is used as part of the
module's repr.
- * If the module has no ``__file__`` but does have a ``__loader__``, then the
- loader's repr is used as part of the module's repr.
+ * If the module has no ``__file__`` but does have a ``__loader__`` that is not
+ ``None``, then the loader's repr is used as part of the module's repr.
* Otherwise, just use the module's ``__name__`` in the repr.
diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst
index ca515f6..9774241 100644
--- a/Doc/whatsnew/3.4.rst
+++ b/Doc/whatsnew/3.4.rst
@@ -231,3 +231,8 @@ that may require changes to your code.
:exc:`NotImplementedError` blindly. This will only affect code calling
:func:`super` and falling through all the way to the ABCs. For compatibility,
catch both :exc:`NotImplementedError` or the appropriate exception as needed.
+
+* The module type now initializes the :attr:`__package__` and :attr:`__loader__`
+ attributes to ``None`` by default. To determine if these attributes were set
+ in a backwards-compatible fashion, use e.g.
+ ``getattr(module, '__loader__', None) is not None``. \ No newline at end of file