当前位置: 首页 > 面试题库 >

异步在python3.5中设置描述符

吴唯
2023-03-14
问题内容

我可以写一个描述符,返回一个可以等待的未来。

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不能在’await’表达式中使用
  • device.attr=5 -> RuntimeWarning:从未等待协程’set

问题答案:

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

虽然__get__返回Future是明智的__set__,但Python
3.5完全不支持进行异步。__set__Python会忽略的返回值,因为没有赋值的“返回值”。且呼叫__set__始终是同步的。就像您已经注意到的那样,a = (b.c = 5)实际上会引发a SyntaxError

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

还要注意,__get__归还未来不会产生__get__协程。

没有更多上下文,您似乎希望在描述符协议提供的属性访问抽象后面隐藏某些内容,最好将其明确地完成,但这当然取决于您。



 类似资料:
  • 在我的不和谐机器人,我希望所有的用户有一个可定制的配置文件。每当运行命令!profile或!p时,机器人就会显示一个包含bio(类似于“Hello World”之类的介绍)、自定义嵌入颜色和其他数据库信息(如硬币、能源等)的嵌入。我想确保当他们运行类似!desc Hello World的东西时,他们的profile embed将有消息Hello World,如果他们运行!desc Lorem,他们

  • 我正在开发一个Eclipse插件,它可以为java项目生成一些模板。 当我调用向导时,我可以选择项目向导,但如果我能在“新建向导页面”中显示我的向导的描述,当它被选中/聚焦时,那就太好了.... 参考图片: 所以在这堂课上 我做了: GetStartingPage().SetDescription(“测试描述”);(没有幸运的结果。) GetStartingPage().SetTitle(“测试描

  • 当我在Weblogic 10.3.6中部署WAR时,它会运行,但在Weblogic 10.3.0中,它会抛出以下内容: 无法加载描述符D:\bea103\user_projects\domain\SRVWinplex\Deployments\WinplexA模块WinplexA的oader2.java:768weblogic.servlet.internal.错误是escriptor.get描述符

  • 问题内容: 我正在尝试将jenkins管道作为代码来做。我正在使用Github组织文件夹插件来扫描Github组织并为每个分支创建作业。有没有一种方法可以明确定义从Jenkinsfile获取的管道作业的名称?我还想为作业添加一些说明。 问题答案: 您需要使用如下所示。该部分很重要 编辑:上面一个重命名生成,其中原始问题是关于重命名作业。在管道中执行以下脚本可以做到这一点(这需要 适当的权限 )

  • 单线程模型 单线程模型指的是,JavaScript 只在一个线程上运行。也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待。 注意,JavaScript 只在一个线程上运行,不代表 JavaScript 引擎只有一个线程。事实上,JavaScript 引擎有多个线程,单个脚本只能在一个线程上运行(称为主线程),其他线程都是在后台配合。 JavaScript 之所以采

  • 三个常见的中断和异常来源: 异常 - sync; 软中断 - sync; 外部中断 - async。 异常的类型: 故障 - 在指令导致异常之前会被准确地报告。%rip保存的指针指向故障的指令; 陷阱 - 在指令导致异常之后会被准确地报告。%rip保存的指针同样指向故障的指令; 终止 - 是不明确的异常。 因为它们不能被明确,中止通常不允许程序可靠地再次启动。 只有当RFLAGS.IF = 1时,