On Fri, Aug 14, 2020 at 04:07:33PM -0700, Caleb Donovick wrote:
My own personal use for this would be for generating anonymous protocols and dataclasses:
class T(Protocol): x: int y: str # with some abuse of notation obviously these would generate unique typesassert T == Struct[x=int, y=str]
I don't know how to interpret these examples. What's Protocol and where does it come from? What's Struct?
As I recall, one of the motivations for re-visiting PEP 472 is to allow such keyword notation in type hints, so that we could write
in a type hint and have it mean a struct with fields x (an int) and y (a str). I'm not sure whether that use in type hinting would allow the use of this Struct to create anonymous classes. I suppose it would, but I'm not expert enough on type hints to be sure.
But assuming the two uses are compatible, I must say that having the same notation for type-hinting a struct and actually creating an anonymous struct class would be desirable:
def func(widget:Struct[x=int, y=str]) -> gadget: pass
# Later: MyWidget = Struct[x=int, y=str]
I really like the look of that, and I think that having the Struct call use the same subscript notation as the Struct type hint is a plus.
While I would not personally use this I think a real killer app would be slicing named axis, as the slice syntax is exclusive to geitem and hence can not leverage the dict trick.
This is one of the motivating use-cases of PEP 472.