From 78b11870a4c441e42cf60dca3a6d22f5896311ba Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sun, 20 Jan 2008 11:22:21 +0000 Subject: Fix now-wrong :keyword: markup. Remove the section about "exec without namespace" from the "don't" howto since exec() can't overwrite names in the calling namespace anymore. --- Doc/howto/doanddont.rst | 33 --------------------------------- Doc/library/bdb.rst | 2 +- Doc/tutorial/controlflow.rst | 2 +- 3 files changed, 2 insertions(+), 35 deletions(-) diff --git a/Doc/howto/doanddont.rst b/Doc/howto/doanddont.rst index 0e6b3e8..9e8a052 100644 --- a/Doc/howto/doanddont.rst +++ b/Doc/howto/doanddont.rst @@ -75,39 +75,6 @@ There are situations in which ``from module import *`` is just fine: * When the module advertises itself as ``from import *`` safe. -Unadorned :keyword:`exec` and friends -------------------------------------- - -The word "unadorned" refers to the use without an explicit dictionary, in which -case those constructs evaluate code in the *current* environment. This is -dangerous for the same reasons ``from import *`` is dangerous --- it might step -over variables you are counting on and mess up things for the rest of your code. -Simply do not do that. - -Bad examples:: - - >>> for name in sys.argv[1:]: - >>> exec "%s=1" % name - >>> def func(s, **kw): - >>> for var, val in kw.items(): - >>> exec "s.%s=val" % var # invalid! - >>> exec(open("handler.py").read()) - >>> handle() - -Good examples:: - - >>> d = {} - >>> for name in sys.argv[1:]: - >>> d[name] = 1 - >>> def func(s, **kw): - >>> for var, val in kw.items(): - >>> setattr(s, var, val) - >>> d={} - >>> exec(open("handle.py").read(), d, d) - >>> handle = d['handle'] - >>> handle() - - from module import name1, name2 ------------------------------- diff --git a/Doc/library/bdb.rst b/Doc/library/bdb.rst index 36f8300..84ea0ae 100644 --- a/Doc/library/bdb.rst +++ b/Doc/library/bdb.rst @@ -294,7 +294,7 @@ The following two methods can be called by clients to use a debugger to debug a .. method:: Bdb.run(cmd, [globals, [locals]]) - Debug a statement executed via the :keyword:`exec` statement. *globals* + Debug a statement executed via the :func:`exec` function. *globals* defaults to :attr:`__main__.__dict__`, *locals* defaults to *globals*. .. method:: Bdb.runeval(expr, [globals, [locals]]) diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 3fedb56..82a8977 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -263,7 +263,7 @@ like in C, procedures are just functions that don't return a value. In fact, technically speaking, procedures do return a value, albeit a rather boring one. This value is called ``None`` (it's a built-in name). Writing the value ``None`` is normally suppressed by the interpreter if it would be the only value -written. You can see it if you really want to using :keyword:`print`:: +written. You can see it if you really want to using :func:`print`:: >>> fib(0) >>> print(fib(0)) -- cgit v0.12