2016-04-16 96 views
1

让我们假设我们有一个具有只能异步设置的属性的类。有没有一种方法可以在不明确调用setter的情况下进行这项工作?异步属性设置器

MNWE:

import asyncio 

loop = asyncio.get_event_loop() 

class AsyncTest: 
    def __init__(self, attrib): 
     self._attrib = attrib 

    @property 
    def attrib(self): 
     return self._attrib 

    @attrib.setter 
    async def set_attrib(self, attrib): 
     await asyncio.sleep(1.0) 
     self._attrib = attrib 


async def main(): 
    t = AsyncTest(1) 
    print(t.attrib) 
    await t.attrib = 3 
    print(t.attrib) 

asyncio.ensure_future(main()) 
loop.run_forever() 

这种失败

File "asyncprop.py", line 22 
    await t.attrib = 3 
    ^
SyntaxError: can't assign to await expression 

这并不奇怪,因为对于await语法是

await ::= ["await"] primary 

如此看来,我们一定会忘记这个不错的@property并且决定使用getters和setter用于异步操作。我错过了什么?

回答

2

您不能在另一个语句中嵌套语句;分配是一个陈述,所以是await。你可以使用setattr()在表达式中设置属性:

await setattr(t, 'attrib', 3) 

然而,property包装中不支持async方法的方式制定者(他们不awaitable),所以你还是有一个明确的更好setter方法。

+0

@Evpok:可能有一种方法来创建自己的'async_property'描述符。 –

+1

是的,但它仍然只能通过'setattr'工作,这种做法会破坏财产的目的。 – Evpok

+0

@Evpok:是的,直到异步分配被添加到您限制使用'setattr()'的语言。我怀疑是否会有这样的特性(对本地或全球甚至意味着什么异步分配)? –