[Python-ideas] A real life example of "given"

Neil Girdhar mistersheik at gmail.com
Thu May 31 07:55:38 EDT 2018


On Thu, May 31, 2018 at 5:39 AM Peter O'Connor <peter.ed.oconnor at gmail.com>
wrote:

> Well, there need not be any ambiguity if you think of "B given A" as
> "execute A before B", and remember that "given" has a lower precedence than
> "for" (So [B given A for x in seq] is parsed as [(B given A) for x in seq]
>
> Then
>
>>
>>     retval = [expr(name) given name=something(x) for x in seq]
>>
>
> Is:
>
>     retval = []
>     for x in seq:
>         name = something(x)
>         retval.append(expr(name))
>
> And
>
>     retval = [expr(name, x) for x in seq given name=something]
>
> Is:
>     retval = []
>     name = something
>     for x in seq:
>         retval.append(expr(name, x))
>
>
> But this is probably not a great solution, as it forces you to mentally
> unwrap comprehensions in a strange order and remember a non-obvious
> precedence rule.
>

You hit the nail on the head.  It forces you to unwarp comprehensions in a
strange order.  This is why I want the "given" to be interspersed with the
"for" and "if" and for everything to be in the order you declare it.

>
>
> On the plus-side, it lets you initialize generators with in-loop updates
> (which cannot as far as I see be done nicely with ":="):
>
>     retval = [expr(name, x) given name=update(name, x) for x in seq given
> name=something]
>
> Is:
>
>     retval = []
>     name = something
>     for x in seq:
>         name = update(name, x)
>         retval.append(expr(name, x))
>

Why wouldn't you want to just put the outer given outside the entire
comprehension?
    retval = [expr(name, x) given name=update(name, x) for x in seq] given
name=something

The more I think about it, the more i want to keep "given" in
comprehensions, and given in expressions using parentheses when given is
supposed to bind to the expression first.

>
>
>
> On Thu, May 31, 2018 at 10:44 AM, Neil Girdhar <mistersheik at gmail.com>
> wrote:
>
>> Yes, you're right. That's the ambiguity I mentioned in my last message.
>> It's too bad because I want given for expressions and given for
>> comprehensions. But if you have both, there's ambiguity and you would at
>> least need parentheses:
>>
>> [(y given y=2*x) for x in range(3)]
>>
>> That might be fine.
>>
>> On Thu, May 31, 2018 at 4:34 AM Peter O'Connor <
>> peter.ed.oconnor at gmail.com> wrote:
>>
>>> * Sorry, message sent too early:
>>>
>>> On Thu, May 31, 2018 at 4:50 AM, Neil Girdhar <mistersheik at gmail.com>
>>> wrote:
>>>>
>>>>
>>>>>     [expression given name=something for x in seq]
>>>>>
>>>>
>>>> retval = []
>>>> name = something
>>>> for x in seq:
>>>>     retval.append(expression)
>>>> return retval
>>>>
>>>
>>> That's a little confusing then, because, given the way given is used
>>> outside of comprehensions, you would expect
>>>
>>>     [y given y=2*x for x in range(3)]
>>>
>>> to return [0, 2, 4], but it would actually raise an error.
>>>
>>>
>>> On Thu, May 31, 2018 at 10:32 AM, Peter O'Connor <
>>> peter.ed.oconnor at gmail.com> wrote:
>>>
>>>>
>>>>
>>>> On Thu, May 31, 2018 at 4:50 AM, Neil Girdhar <mistersheik at gmail.com>
>>>> wrote:
>>>>>
>>>>>
>>>>>>     [expression given name=something for x in seq]
>>>>>>
>>>>>
>>>>> retval = []
>>>>> name = something
>>>>> for x in seq:
>>>>>     retval.append(expression)
>>>>> return retval
>>>>>
>>>>
>>>> That's a little strange confusing then, because, given the way given is
>>>> used outside of comprehensions, you would expect
>>>>
>>>> for x in range(3):
>>>> y given y=2*x
>>>>
>>>>     [y given y=2*x for x in range(3)]
>>>>
>>>> to return [0, 2, 4], but it would actually raise an error.
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20180531/78010362/attachment-0001.html>


More information about the Python-ideas mailing list