summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2021-02-18 11:35:37 (GMT)
committerGitHub <noreply@github.com>2021-02-18 11:35:37 (GMT)
commita3c3ffa68e6fc4524b1149a6a14d56c3a2e9b612 (patch)
tree3dd6f26b5a5fe9b3e2d3bcb0f465bfd28d5bb6b1
parent366dc3a1354078e38808b9c16276e97cca5b8aaf (diff)
downloadcpython-a3c3ffa68e6fc4524b1149a6a14d56c3a2e9b612.zip
cpython-a3c3ffa68e6fc4524b1149a6a14d56c3a2e9b612.tar.gz
cpython-a3c3ffa68e6fc4524b1149a6a14d56c3a2e9b612.tar.bz2
bpo-42990: Add __builtins__ attribute to functions (GH-24559)
Expose the new PyFunctionObject.func_builtins member in Python as a new __builtins__ attribute on functions. Document also the behavior change in What's New in Python 3.10.
-rw-r--r--Doc/library/inspect.rst6
-rw-r--r--Doc/whatsnew/3.10.rst5
-rw-r--r--Lib/test/test_collections.py7
-rw-r--r--Lib/test/test_funcattrs.py5
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2021-02-17-19-02-21.bpo-42990.SKXHiI.rst3
-rw-r--r--Objects/funcobject.c1
6 files changed, 24 insertions, 3 deletions
diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst
index 850d601..1033964 100644
--- a/Doc/library/inspect.rst
+++ b/Doc/library/inspect.rst
@@ -95,6 +95,8 @@ attributes:
| | __globals__ | global namespace in which |
| | | this function was defined |
+-----------+-------------------+---------------------------+
+| | __builtins__ | builtins namespace |
++-----------+-------------------+---------------------------+
| | __annotations__ | mapping of parameters |
| | | names to annotations; |
| | | ``"return"`` key is |
@@ -251,6 +253,10 @@ attributes:
Add ``cr_origin`` attribute to coroutines.
+.. versionchanged:: 3.10
+
+ Add ``__builtins__`` attribute to functions.
+
.. function:: getmembers(object[, predicate])
Return all the members of an object in a list of ``(name, value)``
diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst
index 0fba27c..b903b3e 100644
--- a/Doc/whatsnew/3.10.rst
+++ b/Doc/whatsnew/3.10.rst
@@ -280,6 +280,11 @@ Other Language Changes
* Assignment expressions can now be used unparenthesized within set literals
and set comprehensions, as well as in sequence indexes (but not slices).
+* Functions have a new ``__builtins__`` attribute which is used to look for
+ builtin symbols when a function is executed, instead of looking into
+ ``__globals__['__builtins__']``.
+ (Contributed by Mark Shannon in :issue:`42990`.)
+
New Modules
===========
diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py
index befb7ab..54a4cbe 100644
--- a/Lib/test/test_collections.py
+++ b/Lib/test/test_collections.py
@@ -682,9 +682,10 @@ class TestNamedTuple(unittest.TestCase):
self.assertEqual(np.y, 2)
def test_new_builtins_issue_43102(self):
- self.assertEqual(
- namedtuple('C', ()).__new__.__globals__['__builtins__'],
- {})
+ obj = namedtuple('C', ())
+ new_func = obj.__new__
+ self.assertEqual(new_func.__globals__['__builtins__'], {})
+ self.assertEqual(new_func.__builtins__, {})
################################################################################
diff --git a/Lib/test/test_funcattrs.py b/Lib/test/test_funcattrs.py
index 11d68cc..15cf250 100644
--- a/Lib/test/test_funcattrs.py
+++ b/Lib/test/test_funcattrs.py
@@ -73,6 +73,11 @@ class FunctionPropertiesTest(FuncAttrsTest):
self.cannot_set_attr(self.b, '__globals__', 2,
(AttributeError, TypeError))
+ def test___builtins__(self):
+ self.assertIs(self.b.__builtins__, __builtins__)
+ self.cannot_set_attr(self.b, '__builtins__', 2,
+ (AttributeError, TypeError))
+
def test___closure__(self):
a = 12
def f(): print(a)
diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-17-19-02-21.bpo-42990.SKXHiI.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-17-19-02-21.bpo-42990.SKXHiI.rst
new file mode 100644
index 0000000..cc17154
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-17-19-02-21.bpo-42990.SKXHiI.rst
@@ -0,0 +1,3 @@
+Functions have a new ``__builtins__`` attribute which is used to look for
+builtin symbols when a function is executed, instead of looking into
+``__globals__['__builtins__']``. Patch by Mark Shannon and Victor Stinner.
diff --git a/Objects/funcobject.c b/Objects/funcobject.c
index b331c4c..523930d 100644
--- a/Objects/funcobject.c
+++ b/Objects/funcobject.c
@@ -250,6 +250,7 @@ static PyMemberDef func_memberlist[] = {
{"__doc__", T_OBJECT, OFF(func_doc), 0},
{"__globals__", T_OBJECT, OFF(func_globals), READONLY},
{"__module__", T_OBJECT, OFF(func_module), 0},
+ {"__builtins__", T_OBJECT, OFF(func_builtins), READONLY},
{NULL} /* Sentinel */
};