gpt4 book ai didi

python - 异步设置python3.5中的描述符

转载 作者:太空狗 更新时间:2023-10-30 02:56:45 25 4
gpt4 key购买 nike

我可以写一个描述符返回一个可以等待的 future 。

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: can't assign to await expression
  • await setattr(device, 'attr', 5) -> TypeError: object NoneType can't be used in 'await' expression
  • device.attr=5 -> RuntimeWarning:从未等待协程“__set__”

最佳答案

您尝试执行的操作是不可能的(使用 Python 3.5)。

虽然 __get__ 返回 Future 可能是明智的,但 Python 3.5 根本不支持使 __set__ 异步。 __set__ 的返回值被 Python 忽略,因为没有赋值的“返回值”。并且对 __set__ 的调用始终是同步的。正如您已经注意到的那样,a = (b.c = 5) 实际上会引发 SyntaxError

如果像 await device.attr = 5 这样的异步分配被允许,那么异步描述符可能会有一个单独的协议(protocol),即协程 __aget____aset__ 作为类比异步上下文管理器的特殊方法(async with/__aenter__ )和异步迭代(async for/ __aiter__).参见 PEP 492 async/await 支持背后的设计决策。

另请注意,__get__ 返回 future 不会使 __get__ 成为协程。

在没有进一步上下文的情况下,看起来您想在描述符协议(protocol)提供的属性访问抽象背后隐藏一些东西,这最好明确地完成,但这当然取决于您。

关于python - 异步设置python3.5中的描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39438163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com