Lambda returning tuple question, multi-expression

Thomas Passin list1 at tompassin.net
Sat Mar 11 00:45:01 EST 2023


On 3/10/2023 11:15 PM, aapost wrote:
> On 3/10/23 22:16, Thomas Passin wrote:
[...]
> The additional note in the above is, when taking the def route above, 
> the thing you would have to consider is what scope is the dictionary pids?
> 
> Do you need to submit it to the lambda and subsequently the function 
> such as
> lambda pids=pids: (
>      update_pids("messages", pids),
>      update_pids("syslog", pids),
> 
> So that update_pids can access it? Or in your design do you have a 
> separate management of it that def update_pids already has access to? 
> (either is valid depending on design intent).

It's easy enough to try out.  I'm not going to simulate the dictionary, 
because it's basically just another argument, and I assume that your 
example code uses it because it needs to be in that form.  For the scope 
question, see below after the basic example.

 >>> def printme(x): print(x)  # Let's not quibble about inline defs!

 >>> printme('xxx')
xxx
 >>> cmd = lambda x: (
...     printme('this'),
...     printme('is'),
...     printme('a test')
...     )

(Yes, I know it's not recommended to assign a lambda to a variable name, 
but I'm doing it here just to demonstrate that the lambda works as desired).

 >>> cmd(2)
this
is
a test
(None, None, None)

So it executes the intended steps and returns a tuple of three None 
values, as expected.  When used as the target of the "command" arg in 
the Tk control constructor, I presume the tuple would be ignored just as 
a return of None would be.  But that would need to be tested.

If returning a tuple instead of None were to cause a problem, you could 
do this:

cmd = lambda x: (
     printme('this'),
     printme('is'),
     printme('a test')
    ) and None

 >>> cmd(2)
this
is
a test

But now you are introducing a construct whose purpose is not totally 
obvious, does not cause any intended effect, and in fact is only 
required by the nature of the code receiving the callback, which you 
cannot know by reading this code.  So if this construct turns out to be 
needed, we're forced to take a step away from having the code be as 
direct and understandable as possible.  It's still better in that way 
than the earlier illustrations (which BTW would also have required the 
"and None" construct).

To test out the scope question:

 >>> def printme(x): print(y)  # Print some other variable, not "x"
 >>> y = 'I am y'  # Will "y" get passed through into the lambda?

 >>> cmd = lambda x: (
...    printme('this'),
...    printme('is'),
...    printme('a test')
... ) and None

 >>> cmd(2)
I am y
I am y
I am y

But maybe the original value of "y" gets baked in at compile time. Let's 
see:

 >>> y = 'I am a post-compile assignment'
 >>> cmd(2)
I am a post-compile assignment
I am a post-compile assignment
I am a post-compile assignment

Good, the current value of "y" gets used.



More information about the Python-list mailing list