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