import asyncio
[docs]def all_subclasses(cls):
subclasses = set()
for subclass in cls.__subclasses__():
subclasses.add(subclass)
subclasses = subclasses | all_subclasses(subclass)
return subclasses
[docs]def is_future(target):
return isinstance(target, asyncio.Future)
[docs]async def acall(target, *args, **kwargs):
if asyncio.iscoroutinefunction(target) or is_future(target):
return await target(*args, **kwargs)
else:
result = target(*args, **kwargs)
if asyncio.iscoroutine(result):
return await result
else:
return result
[docs]class classproperty:
def __init__(self, func):
self.func = func
def __get__(self, instance, owner):
return self.func(owner)