Hello all, 

Sorry to bother you again with the generic thing. Golang will soon release a 
new version with Generics. I like their way of doing it. Like Rust, they don’t 
bother with TypeVars. It makes you wonder why we are not doing something 
similar in Python. 
[T: Type] ——> T is invariant and Type is the bound. [T] is Ok.
[T_co:: Type] ——> T is covariant and Type is the bound. [T_co::] is Ok.
[T_contra::: Type] —-> T is contravariant and Type is the bound . [T_contra:::] 
is Ok.

Or some other symbol next to : to distinguish the variance. 

[T: Type1 | Type2] —-> T is invariant and Type1 and Type2 are the constraints. 
Or anything else to communicate these are constraints (maybe enclose them in 
parentheses — tuple) 

Example:

class Indexable[T_co::](Protocol[T_co]): 
    def __getitem__(self, n: int) -> T_co: …

@dataclass
class AInt:
    seq: list[int] 
    
    def __getitem__(self, n: int) -> Int:
        return self.seq[n] 

@dataclass
class BStr:
    seq: list[str] 
    
    def __getitem__(self, n: int) -> str:
        return self.seq[n] 

    
def get[T: int | str](n: int, object: Indexable[T]) -> T: 
    return object[n] 

get(1, AInt([1, 2])) # ok 
get(1, BStr([“one”, “two”])) # ok 

Abdulla 

Sent from my iPhone 
_______________________________________________
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/3EKKM6JEJYH2XN6OCIBUPCH7PLTEXVMN/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to