Python 异步属性设置器

Python 异步属性设置器,python,async-await,Python,Async Await,假设我们有一个类,其属性只能异步设置。有没有一种方法可以在不显式调用setter的情况下实现这一点 MNWE: 这与 File "asyncprop.py", line 22 await t.attrib = 3 ^ SyntaxError: can't assign to await expression 这并不奇怪,因为await的语法是 await ::= ["await"] primary 因此,我们似乎注定要忘记这个漂亮的@属性,转而使用getter和s

假设我们有一个类,其属性只能异步设置。有没有一种方法可以在不显式调用setter的情况下实现这一点

MNWE:

这与

  File "asyncprop.py", line 22
    await t.attrib = 3
       ^
SyntaxError: can't assign to await expression
这并不奇怪,因为
await
的语法是

await ::=  ["await"] primary

因此,我们似乎注定要忘记这个漂亮的
@属性
,转而使用getter和setter进行异步操作。我遗漏了什么吗?

你不能将一条语句嵌套在另一条语句中;赋值是一个语句,
wait
也是一个语句。您可以使用
setattr()
在表达式中设置属性:

await setattr(t, 'attrib', 3)

但是,
属性
以不支持
异步
方法的方式包装setter(它们是不可等待的),因此使用显式setter方法更好。

您可以使用
异步属性
包:

例如:

从异步\u属性导入异步\u属性
Foo类:
@异步_属性
异步def远程_值(自身):
返回等待获取远程值()
f=Foo()
等待f.remote_值

@Evpok:可能有一种方法可以创建您自己的
async_属性
描述符。是的,但它仍然只能通过
setattr
工作,这与拥有属性的目的背道而驰。@Evpok:是的,直到将异步赋值添加到您只能使用的语言
setattr()
。我怀疑是否会有这样一个功能(异步分配到本地或全局甚至意味着什么)?在我的脑海中,
Browser.current\u url='10〕http://example.com“
其中赋值也将执行http请求以获取页面,但可能还有其他用例。@Evpok:这是在设置属性,不是全局或本地名称。:-)注意:从异步属性0.2.1开始,它不支持setter。
await setattr(t, 'attrib', 3)