mirror of
https://github.com/kennethreitz/python-guide.git
synced 2026-06-05 23:00:18 +00:00
gotchas: fix naming; remove generator in def example
This commit is contained in:
@@ -142,28 +142,32 @@ fact the same exact behavior is exhibited by just using an ordinary ``def``:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def create_adders():
|
||||
def create_multipliers():
|
||||
multipliers = []
|
||||
|
||||
for i in range(5):
|
||||
def adder(x):
|
||||
def multiplier(x):
|
||||
return i * x
|
||||
yield adder
|
||||
multipliers.append(multiplier)
|
||||
|
||||
return multipliers
|
||||
|
||||
What You Should Do Instead
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Well. Here the general solution is arguably a bit of a hack. Due to Python's
|
||||
The most general solution is arguably a bit of a hack. Due to Python's
|
||||
afformentioned behavior concerning evaluating default arguments to functions
|
||||
(see :ref:`default_args`), you can create a closure that binds immediately to
|
||||
its arguments by using a default arg like so:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def create_adders():
|
||||
def create_multipliers():
|
||||
return [lambda x, i=i : i * x for i in range(5)]
|
||||
|
||||
When the Gotcha Isn't a Gotcha
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
When you want your closures to behave this way. Late binding is good in lots of
|
||||
Sometimes you want your closures to behave this way. Late binding is good in lots of
|
||||
situations. Looping to create unique functions is unfortunately a case where
|
||||
they can cause hiccups.
|
||||
|
||||
Reference in New Issue
Block a user