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

Peter O'Connor peter.ed.oconnor at gmail.com
Thu May 31 05:38:57 EDT 2018

```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.

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))

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/5c715d5a/attachment-0001.html>
```