I have a class and a corresponding factory function that holds some state in a closure (event_bus
):
from typing import TypeVar, Generic, Callable, Any
class EventBus:
def subscribe(self):
print("Subscribed")
def publish(self):
print("Published")
T = TypeVar('T')
def create_property(event_bus: EventBus):
class Property(Generic[T]):
def __init__(self, validator: Callable[[T], bool]):
self._validator = validator
def __set_name__(self, obj: Any, name: str):
self.name = name
def __get__(self, obj: Any, type: Any) -> T:
return obj.__dict__.get(self.name)
def __set__(self, obj: Any, value: T):
if not self._validator(value):
raise ValueError("Invalid value")
obj.__dict__[self.name] = value
event_bus.publish()
def property(validator: Callable[[T], bool] = lambda x: True) -> Property[T]:
return Property(validator)
return property
Now this compiles, and the property
function has the correct type: Callable[..., Property[T]]
. Property
can be used as a descriptor, but when I try to do so I get compiler errors:
property: Callable[..., Property[T]] = create_property(EventBus())
class MyComponent:
width = property() # Type of "width" is partially unknown
# Type of "width" is "Property[Unknown]
height: int = property(lambda x: x > 0) # Expression of type "Property[Unknown]" is
# incompatible with declared type "int"
What am I doing wrong? How do I call the generic property
function properly?
4