[Python-ideas] Where-statement (Proposal for function expressions)

Carl Johnson cmjohnson.mailinglist at gmail.com
Sun Jul 19 04:21:24 CEST 2009


Steven D'Aprano wrote:

> That's a definition of "within" that I'm not really happy with. And I
> think it's wrong. Consider the timing of calls:


> To my mind, to say that the contents of the where-block occur "within"
> the call to sort, it would imply that you get output like this:
>
> Call to sort() started at 1234560000.23 seconds
> Enter the where-block at 1234560000.24 seconds
> Call to sort() ended at 1234560555.25 seconds

By that definition though, a lambda isn't compiled "within" the sort
expression. First the lambda is compiled then it is passed as an
argument to sort. But you earlier wrote that,

> For the function definition to appear inside the call to sort,
> you'd need to write something like:
>
>   items.sort(key=lambda item: value)

But that doesn't follow at all. Items.sort isn't called until there
are arguments that can be passed to it. The timing of this would be
the exact same as a where block:

>>> import time
>>> class MyList(list):
...    def sort(self, *args, **kwargs):
...        print("Call to sort() started at %s seconds" % time.time())
...        super(MyList, self).sort(*args, **kwargs)
...        print("Call to sort() ended at %s seconds" % time.time())
...
>>> items = MyList([-9, 7, -4, 2, -1, 0, 3])
>>>
>>>
>>> def do_stuff():
...    print("Enter the fake where-block at %s seconds" % time.time())
...    time.sleep(10)
...
>>> items.sort(key=lambda item, default=do_stuff(): abs(item))
Enter the where-block at 1247970018.89 seconds
Call to sort() started at 1247970028.89 seconds
Call to sort() ended at 1247970028.89 seconds


-- Carl



More information about the Python-ideas mailing list