]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
DOCS: Suggest always calling exec with a globals argument and no locals argument...
authorHood Chatham <roberthoodchatham@gmail.com>
Mon, 20 May 2024 17:42:15 +0000 (13:42 -0400)
committerGitHub <noreply@github.com>
Mon, 20 May 2024 17:42:15 +0000 (17:42 +0000)
Many users think they want a locals argument for various reasons but they do not
understand that it makes code be treated as a class definition. They do not want
their code treated as a class definition and get surprised. The reason not
to pass locals specifically is that the following code raises a `NameError`:

```py
exec("""
def f():
    print("hi")

f()

def g():
    f()
g()
""", {}, {})
```

The reason not to leave out globals is as follows:

```py
def t():
    exec("""
def f():
    print("hi")

f()

def g():
    f()
g()
    """)
```

Doc/library/functions.rst

index 0c7ef67774cd0575795be5604624205103bf48da..3986ace02b561a97551cf6ae49193343a1d97213 100644 (file)
@@ -608,9 +608,13 @@ are always available.  They are listed here in alphabetical order.
    will be used for both the global and the local variables.  If *globals* and
    *locals* are given, they are used for the global and local variables,
    respectively.  If provided, *locals* can be any mapping object.  Remember
-   that at the module level, globals and locals are the same dictionary. If exec
-   gets two separate objects as *globals* and *locals*, the code will be
-   executed as if it were embedded in a class definition.
+   that at the module level, globals and locals are the same dictionary.
+
+   .. note::
+
+      Most users should just pass a *globals* argument and never *locals*.
+      If exec gets two separate objects as *globals* and *locals*, the code
+      will be executed as if it were embedded in a class definition.
 
    If the *globals* dictionary does not contain a value for the key
    ``__builtins__``, a reference to the dictionary of the built-in module