Hi Ronald,

sure, the tuple is usually not very interesting; people look it up
once and use that info in the code.

But I think things can be made quite efficient and pretty at the
same time. Such a return tuple could be hidden like the stat_result
example that Guido mentioned:

https://github.com/python/typeshed/blob/master/stdlib/3/os/__init__.pyi

    def stat(self, *, follow_symlinks: bool = ...) -> stat_result: ...

The stat_result is a huge structure where you don't want to see much
unless you are working with a stat_result.

Other with common, repeating patterns like (x, y, width, height)
or your examples:

    def getpoint(v: pointless) -> (int, int)
    def getvalue(v: someclass) -> (bool, int)

would be at first sight

    def getpoint(v: pointless) -> getpoint_result
    def getvalue(v: someclass) -> getvalue_result

But actually, a much nicer, speaking outcome would be written as
the single function StructSequence(...) with arguments, producing:

    def getpoint(v: pointless) -> StructSequence(x=int, y=int)
    def getvalue(v: someclass) -> StructSequence(result=bool, val=int)

That would have the nice effect of a very visible structure in
the .pyi file. When you actually get such an object and look at it,
then you have

>>> getpoint(pointless())
getpoint_result(x=17, y=4)
>>> getvalue(someclass())
getvalue_result(result=True, val=42))

And the "magic" function StructSequence would simply index a dict
with the given argument tuple that gives the right struct sequence.
This is always possible, since only names and types are involved
in the lookup.

Cheers -- Chris


On 08.08.19 14:22, Ronald Oussoren wrote:
> Chrisian,
> 
> How would these namedtuple/structseq values be used? I have a similar
> design with PyObjC: pass-by-reference “return” values are returned in a
> tuple, e.g.:
> 
>     void getpoint(pointclass* v, int* x, int *y)    =>    def get
> point(v: pointless) -> (int, int)
>     BOOL getvalue(someclass* v, int* val)      =>    def getvalue(v:
> someclass) -> (bool, int)
> 
> I rarely, if ever, see code that actually stores the return tuple as-is.
> The return tuple is just deconstructed immediately, like “x, y =
> getpoint(mypoint)”. 
> 
> Ronald
> —
> 
> Twitter: @ronaldoussoren
> Blog: https://blog.ronaldoussoren.net/
> 
>> On 8 Aug 2019, at 10:42, Christian Tismer <tis...@stackless.com
>> <mailto:tis...@stackless.com>> wrote:
>>
>> Hi Guido,
>>
>> If a C++ function already has a return value, plus some primitive
>> pointer variables that need to be moved into the result in Python,
>> then we have the case with a first, single unnamed field.
>> Only one such field can exist.
>>
>> I'm not sure if that case exists in the ~25000 Qt5 functions, but in
>> that case, I think to give that single field the name "unnamed"
>> or maybe better "result".
>>
>> Thank you very much for pointing me to that example!
>>
>> Cheers -- Chris
>>
>>
>> On 08.08.19 06:41, Guido van Rossum wrote:
>>> Alas, we didn't think of struct sequences when we designed PEP 484. It
>>> seems they are a hybrid of Tuple and NamedTuple; both of these are
>>> currently special-cased in mypy in ways that cannot easily be combined.
>>>
>>> Do you really need anonymous fields?
>>>
>>> I see an example in typeshed/stdlib/3/os/__init__.pyi (in
>>> github.com/python/typeshed <http://github.com/python/typeshed>
>>> <http://github.com/python/typeshed>), for
>>> stat_result. It defines names for all the fields, plus a __getitem__()
>>> method that indicates that indexing returns an int. This doesn't help if
>>> anonymous fields could have different types, not does it teach the type
>>> checker about the number of anonymous fields.
>>>
>>> --Guido
>>>
>>> On Wed, Aug 7, 2019 at 1:51 AM Christian Tismer <tis...@stackless.com
>>> <mailto:tis...@stackless.com>
>>> <mailto:tis...@stackless.com>> wrote:
>>>
>>>    Hi all,
>>>
>>>    Ok, I am about to implement generation of such structures
>>>    automatically using the struct sequence concept.
>>>
>>>
>>>    One more question:
>>>    ------------------
>>>
>>>    Struct sequences are not yet members of the typing types.
>>>    I would like to add that, because a major use case is also to
>>>    show nice .pyi files with all the functions and types.
>>>
>>>    * namedtuple has made the transition to NamedTuple
>>>
>>>    * What would I need to do that for StructSequence as well?
>>>
>>>    Things get also a bit more complicated since struct sequence
>>>    objects can contain unnamed fields.
>>>
>>>    Any advice would be appreciated, I am no typing expert (yet :-)
>>>
>>>    cheers -- Chris
>>>
>>>
>>>    On 30.07.19 17:10, Guido van Rossum wrote:
>>>> I think I have to agree with Petr. Define explicit type names.
>>>>
>>>> On Tue, Jul 30, 2019 at 2:45 AM Paul Moore <p.f.mo...@gmail.com
>>>> <mailto:p.f.mo...@gmail.com>
>>>    <mailto:p.f.mo...@gmail.com>
>>>> <mailto:p.f.mo...@gmail.com <mailto:p.f.mo...@gmail.com>>> wrote:
>>>>
>>>>      On Tue, 30 Jul 2019 at 09:33, Christian Tismer
>>>    <tis...@stackless.com <mailto:tis...@stackless.com>
>>> <mailto:tis...@stackless.com>
>>>>      <mailto:tis...@stackless.com <mailto:tis...@stackless.com>>>
>>>    wrote:
>>>>      > >>> typing.NamedTuple("__f", x=int, y=int)
>>>>      > <class '__main__.__f'>
>>>>      > >>> typing.NamedTuple("__f", x=int, y=int) is
>>>    typing.NamedTuple("__f",
>>>>      > x=int, y=int)
>>>>      > False
>>>>
>>>>      This appears to go right back to collections.namedtuple:
>>>>
>>>>      >>> from collections import namedtuple
>>>>      >>> n1 = namedtuple('f', ['a', 'b', 'c'])
>>>>      >>> n2 = namedtuple('f', ['a', 'b', 'c'])
>>>>      >>> n1 is n2
>>>>      False
>>>>
>>>>      I found that surprising, as I expected the named tuple type to be
>>>>      cached based on the declared name 'f'. But it's been that way
>>>    forever
>>>>      so obviously my intuition here is wrong. But maybe it would be
>>>    useful
>>>>      for this case if there *was* a way to base named tuple
>>>    identity off
>>>>      the name/fields? It could be as simple as caching the results:
>>>>
>>>>      >>> from functools import lru_cache
>>>>      >>> cached_namedtuple = lru_cache(None)(namedtuple)
>>>>      >>> n1 = cached_namedtuple('f', ('a', 'b', 'c')) # A tuple rather
>>>>      than a list of field names, as lists aren't hashable
>>>>      >>> n2 = cached_namedtuple('f', ('a', 'b', 'c'))
>>>>      >>> n1 is n2
>>>>      True
>>>>
>>>>      Paul
>>>>
>>>>
>>>>
>>>> --
>>>> --Guido van Rossum (python.org/~guido <http://python.org/~guido>
>>>> <http://python.org/~guido>
>>>    <http://python.org/~guido>)
>>>> /Pronouns: he/him/his //(why is my pronoun here?)/
>>>>
>>>    
>>> <http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/>
>>>>
>>>> _______________________________________________
>>>> Python-Dev mailing list -- python-dev@python.org
>>>> <mailto:python-dev@python.org>
>>>    <mailto:python-dev@python.org>
>>>> To unsubscribe send an email to python-dev-le...@python.org
>>>> <mailto:python-dev-le...@python.org>
>>>    <mailto:python-dev-le...@python.org>
>>>> https://mail.python.org/mailman3/lists/python-dev.python.org/
>>>> Message archived at
>>>    
>>> https://mail.python.org/archives/list/python-dev@python.org/message/GIFRTFWPEGKZ33PTW63YXKGXHHAQJ35I/
>>>>
>>>
>>>
>>>    --
>>>    Christian Tismer             :^)   tis...@stackless.com
>>> <mailto:tis...@stackless.com>
>>>    <mailto:tis...@stackless.com>
>>>    Software Consulting          :     http://www.stackless.com/
>>>    Karl-Liebknecht-Str. 121     :     https://github.com/PySide
>>>    14482 Potsdam                :     GPG key -> 0xFB7BEE0E
>>>    phone +49 173 24 18 776  fax +49 (30) 700143-0023
>>>
>>>
>>>
>>> -- 
>>> --Guido van Rossum (python.org/~guido <http://python.org/~guido>
>>> <http://python.org/~guido>)
>>> /Pronouns: he/him/his //(why is my pronoun here?)/
>>> <http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/>
>>>
>>> _______________________________________________
>>> Python-Dev mailing list -- python-dev@python.org
>>> <mailto:python-dev@python.org>
>>> To unsubscribe send an email to python-dev-le...@python.org
>>> <mailto:python-dev-le...@python.org>
>>> https://mail.python.org/mailman3/lists/python-dev.python.org/
>>> Message archived at
>>> https://mail.python.org/archives/list/python-dev@python.org/message/QZ44KHLLNL54ZCHEAQ5WBWCOV7AU2HGW/
>>>
>>
>>
>> -- 
>> Christian Tismer             :^)   tis...@stackless.com
>> <mailto:tis...@stackless.com>
>> Software Consulting          :     http://www.stackless.com/
>> Karl-Liebknecht-Str. 121     :     https://github.com/PySide
>> 14482 Potsdam                :     GPG key -> 0xFB7BEE0E
>> phone +49 173 24 18 776  fax +49 (30) 700143-0023
>> _______________________________________________
>> Python-Dev mailing list -- python-dev@python.org
>> <mailto:python-dev@python.org>
>> To unsubscribe send an email to python-dev-le...@python.org
>> <mailto:python-dev-le...@python.org>
>> https://mail.python.org/mailman3/lists/python-dev.python.org/
>> Message archived at
>> https://mail.python.org/archives/list/python-dev@python.org/message/I4LGR6Q6QJ5L4AIWI4BRMXUTXEGIMYJ2/
> 


-- 
Christian Tismer             :^)   tis...@stackless.com
Software Consulting          :     http://www.stackless.com/
Karl-Liebknecht-Str. 121     :     https://github.com/PySide
14482 Potsdam                :     GPG key -> 0xFB7BEE0E
phone +49 173 24 18 776  fax +49 (30) 700143-0023
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/ETAFIDB67C7PYPKMUEUSFFYD4X55PBBZ/

Reply via email to