On Fri, Jun 18, 2021 at 10:10:33PM +0900, Stephen J. Turnbull wrote:

> Pretty clearly the * means ...
> 
> It did take me a bit of thought to come to Ben's intended
> interpretation ...

So perhaps not actually that clear then? *wink*

In hindsight, after realising what Ben's intention was (at least we 
assume that is what he was thinking of) it does seem like a reasonable 
way of unpacking multiple items into a list or set comprehension at 
once.

I don't think that this is something that we could say was "intuitively 
obvious" to somebody who is neither Dutch not experienced with Python, 
but I think it is retroactively obvious once explained.

Unpacking comprehensions:

    [*item for item in sequence]
    {*item for item in sequence]


are syntactic sugar for something roughly equivalent to:

    result = []  # or set()
    for item in sequence:
        for tmp in item:
            result.append(tmp)  # or result.add


The exact implementation could vary, e.g. by using `extend` for list 
comprehensions.


That suggests a meaning for double-star unpacking in a dict 
comprehension (single-star unpacking would make it a set).

    {**item for item in seq}

    # equivalent to:
    result = {}
    for item in seq:
        result.update(item)


And these suggest meanings for the equivalent in generator 
expressions:

    (*item for item in sequence)

    # equivalent to:
    (tmp for item in sequence for tmp in item)


The double-star version would follow similar rules to dict.update:

    (**item for item in sequence)

    # equivalent to:
    def gen():
        for item in sequence:
           if hasattr(item, 'keys'):
                for k in item:
                     yield (k, item[k])
           else:
                for k, v in item:
                     yield (k, v)


Works for me.


-- 
Steve
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/P2QSA6K3T3BJRX26HR4W36447XGHNM2F/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to