Конструкция await setattr(device,'attr',5) также возможна и на самом деле более прилична, чем device.attr = 5, но, конечно, не перегружайте подлинный setattr.
этот на самом деле полезен для асинхронного безпоточности, сохраняя при этом удобочитаемость. работающий код, который устанавливает значение без ожидания, вызовет приятное «Предупреждение о выполнении: сопрограмма attr.__set__
никогда не ожидалась»
import asyncio, sys
async def main():
obj.attr = "not async value"
print(obj.attr)
print()
print("now give set an async value")
#DO NOT DO THAT use aio.asetattr(obj,'attr',5)
setattr = aio.asetattr
# ============== yes i can, thanks python ! ===========
await setattr(obj,'attr',5)
# ======================================
print(obj.attr)
print("bye")
flush_io()
def flush_io():
sys.stdout.flush()
sys.stderr.flush()
class attr:
def __init__(self, value):
self.value = value
def __get__(self, obj, objtype):
if obj is None:
return self
return self.value
async def __set__(self, obj, value):
if value is not obj.__class__:
print(" async updating", self, end=" ")
for i in range(value):
await asyncio.sleep(1)
print(".", end="")
flush_io()
print()
self.value = value
print("set", obj, value)
return
print("__set__", obj, value)
def __repr__(self):
return "<async attr>"
class aobj:
attr = attr("empty")
def __repr__(self):
return "<aobj>"
class aio:
async def asetattr(self, obj, attr, value):
await asyncio.sleep(1)
a_attr = getattr( type(obj), attr)
await a_attr.__set__(obj, value)
print("done!")
aio = aio()
obj = aobj()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
person
Pmp P.
schedule
02.12.2018
__set__
не должен ничего возвращать. Вы хотели, чтобыvalue
разрешалось асинхронно? - person jonrsharpe   schedule 11.09.2016