2016-09-11 1 views
2

Я могу написать дескриптор, возвращающий будущее, на которое можно было бы ожидать.Установка дескриптора в python3.5 асинхронно

class AsyncDescriptor: 
    def __get__(self, obj, cls=None): 
     # generate some async future here 
     return future 

    def __set__(self, obj, value): 
     # generate some async future here 
     return future 

class Device: 
    attr=AsyncDescriptor() 

device=Device() 

Теперь я могу получить значение в сопрограмме с value=await device.attr.

Как бы установить этот атрибут?

  • await device.attr=5 -> SyntaxError: не может назначить ждать выражение:
  • await setattr(device, 'attr', 5) -> TypeError: объект NoneType не может быть использован в 'ждут' выражение
  • device.attr=5 -> RuntimeWarning: сопрограммная '__set__' никогда не ожидалось
+0

'__set__' не должен ничего возвращать. Вы хотите, чтобы «значение» было разрешено асинхронно? – jonrsharpe

+0

Да, это была бы цель –

+0

Но ваши примеры все передают значение, а не будущее. – jonrsharpe

ответ

2

То, что вы пытаетесь сделать, невозможно (с Python 3.5).

Хотя может быть разумным для __get__, чтобы вернуть Будущее, делая __set__ async просто не поддерживается Python 3.5. Возвращаемое значение __set__ игнорируется Python, поскольку нет «возвращаемого значения» присвоений. И звонок __set__ всегда синхронный. Что-то вроде a = (b.c = 5) фактически поднимает SyntaxError, как вы уже заметили.

Если асинхронные задания как await device.attr = 5 были разрешено, то, вероятно, будет отдельным протокол для асинхронных дескрипторов, т.е. с сопрограммами __aget__ и __aset__ в качестве специальных методов по аналогии с контекстом асинхронного менеджером (async with/__aenter__) и асинхронной итерацией (async for/__aiter__). См. PEP 492 для проектных решений за поддержкой async/await.

Также обратите внимание, что __get__ возвращение в будущее не делает __get__ a coroutine.

Без дополнительного контекста, похоже, что вы хотите скрыть что-то за абстракцией доступа к атрибуту, предоставляемой протоколом дескриптора, что лучше делать явно, но это зависит от вас, конечно.