updade from Atlas repo
This commit is contained in:
@@ -2,25 +2,25 @@ from typing import TypeVar, Generic
|
||||
|
||||
|
||||
class Beverage:
|
||||
"""Any beverage"""
|
||||
"""Any beverage."""
|
||||
|
||||
|
||||
class Juice(Beverage):
|
||||
"""Any fruit juice"""
|
||||
"""Any fruit juice."""
|
||||
|
||||
|
||||
class OrangeJuice(Juice):
|
||||
"""Delicious juice from Brazilian oranges"""
|
||||
"""Delicious juice from Brazilian oranges."""
|
||||
|
||||
|
||||
BeverageT = TypeVar('BeverageT', covariant=True)
|
||||
T_co = TypeVar('T_co', covariant=True)
|
||||
|
||||
|
||||
class BeverageDispenser(Generic[BeverageT]):
|
||||
def __init__(self, beverage: BeverageT) -> None:
|
||||
class BeverageDispenser(Generic[T_co]):
|
||||
def __init__(self, beverage: T_co) -> None:
|
||||
self.beverage = beverage
|
||||
|
||||
def dispense(self) -> BeverageT:
|
||||
def dispense(self) -> T_co:
|
||||
return self.beverage
|
||||
|
||||
|
||||
@@ -36,11 +36,11 @@ class Compostable(Biodegradable):
|
||||
"""Compostable garbage."""
|
||||
|
||||
|
||||
GarbageT = TypeVar('GarbageT', contravariant=True)
|
||||
T_contra = TypeVar('T_contra', contravariant=True)
|
||||
|
||||
|
||||
class TrashCan(Generic[GarbageT]):
|
||||
def put(self, trash) -> None:
|
||||
class TrashCan(Generic[T_contra]):
|
||||
def put(self, trash: T_contra) -> None:
|
||||
"""Store trash until dumped..."""
|
||||
|
||||
|
||||
@@ -48,35 +48,48 @@ class Cafeteria:
|
||||
def __init__(
|
||||
self,
|
||||
dispenser: BeverageDispenser[Juice],
|
||||
trash_can: TrashCan[Biodegradable]
|
||||
trash_can: TrashCan[Biodegradable],
|
||||
):
|
||||
"""Initialize..."""
|
||||
|
||||
|
||||
beverage_dispenser = BeverageDispenser(Beverage())
|
||||
juice_dispenser = BeverageDispenser(Juice())
|
||||
orange_juice_dispenser = BeverageDispenser(OrangeJuice())
|
||||
################################################ exact types
|
||||
|
||||
trash_can: TrashCan[Garbage] = TrashCan()
|
||||
juice_dispenser = BeverageDispenser(Juice())
|
||||
bio_can: TrashCan[Biodegradable] = TrashCan()
|
||||
compost_can: TrashCan[Compostable] = TrashCan()
|
||||
|
||||
arnold_hall = Cafeteria(juice_dispenser, bio_can)
|
||||
|
||||
######################## covariance on 1st argument
|
||||
arnold_hall = Cafeteria(orange_juice_dispenser, trash_can)
|
||||
|
||||
################################################ covariant dispenser
|
||||
|
||||
orange_juice_dispenser = BeverageDispenser(OrangeJuice())
|
||||
|
||||
arnold_hall = Cafeteria(orange_juice_dispenser, bio_can)
|
||||
|
||||
|
||||
################################################ non-covariant dispenser
|
||||
|
||||
beverage_dispenser = BeverageDispenser(Beverage())
|
||||
|
||||
## Argument 1 to "Cafeteria" has
|
||||
## incompatible type "BeverageDispenser[Beverage]"
|
||||
## expected "BeverageDispenser[Juice]"
|
||||
# arnold_hall = Cafeteria(beverage_dispenser, trash_can)
|
||||
# arnold_hall = Cafeteria(beverage_dispenser, bio_can)
|
||||
|
||||
|
||||
######################## contravariance on 2nd argument
|
||||
################################################ contravariant trash
|
||||
|
||||
trash_can: TrashCan[Garbage] = TrashCan()
|
||||
|
||||
arnold_hall = Cafeteria(juice_dispenser, trash_can)
|
||||
|
||||
|
||||
################################################ non-contravariant trash
|
||||
|
||||
compost_can: TrashCan[Compostable] = TrashCan()
|
||||
|
||||
## Argument 2 to "Cafeteria" has
|
||||
## incompatible type "TrashCan[Compostable]"
|
||||
## expected "TrashCan[Biodegradable]"
|
||||
# arnold_hall = Cafeteria(juice_dispenser, compost_can)
|
||||
|
||||
arnold_hall = Cafeteria(juice_dispenser, trash_can)
|
||||
|
||||
@@ -29,14 +29,6 @@ class Box(Generic[T]):
|
||||
return self.contents
|
||||
|
||||
|
||||
T_contra = TypeVar('T_contra', contravariant=True)
|
||||
|
||||
|
||||
class InBox(Generic[T_contra]):
|
||||
def put(self, item: T) -> None:
|
||||
self.contents = item
|
||||
|
||||
|
||||
T_co = TypeVar('T_co', covariant=True)
|
||||
|
||||
|
||||
@@ -46,3 +38,11 @@ class OutBox(Generic[T_co]):
|
||||
|
||||
def get(self) -> Any:
|
||||
return self.contents
|
||||
|
||||
|
||||
T_contra = TypeVar('T_contra', contravariant=True)
|
||||
|
||||
|
||||
class InBox(Generic[T_contra]):
|
||||
def put(self, item: T) -> None:
|
||||
self.contents = item
|
||||
|
||||
Reference in New Issue
Block a user