gpt4 book ai didi

python - 带有属性的奇怪的 python 列表语法

转载 作者:太空宇宙 更新时间:2023-11-04 03:56:38 26 4
gpt4 key购买 nike

我目前正在通过为 MCedit python 程序(Minecraft 的 3D block 编辑器)编写过滤器来学习 python。过滤器是可以作为函数在程序内部运行的一小段代码。

MCedit 提供的功能之一允许提取原理图(此处命名为 temp)以对其进行修改。在演示中,程序的创建者通过以下行修改原理图的 block 属性:

temp.blocks[temp.blocks == 14] = 52

.blocks 属性由 3 层(x、y、z)上的串联列表组成。

这段代码将任何列表中等于 14 的值替换为 52。

我试图让它改变其他值,方法是:

temp.blocks[temp.blocks == 14 or temp.blocks == 15] = 52

但它根本不起作用。

我知道还有其他方法可以做到这一点,但这个方法特别简单、紧凑和高效,我想了解它是如何工作的。

最佳答案

底层 blocks 类的作者已经替换了各种 Python 表达式的普通语义来实现一种迷你查询语言。

blocks 类很可能会覆盖 __setitem____eq__钩子(Hook)。

temp.blocks == 14 表达式由 __eq__ Hook 处理并返回一些 类型的专用对象,然后传递给__setitem__ 通过 [...] 语法 Hook 。 __setitem__ Hook 然后使用该专用对象来确定要更改的序列中的哪些索引。

== 运算符在任一操作数上查找 __eq__ 方法,如果存在,则调用该方法并返回值(通常为 TrueFalse) 作为该相等性测试的结果返回。但是,temp.blocks 上的 __eq__ 方法会返回一些else;并且“某物”还可以实现额外的 Hook (例如 __or____and__)以进一步优化查询语言。

temp.blocks[expr1] = expr2 赋值被转换为 blocks.__setitem__(expr1, expr2),因此 blocks.__eq__( 14) 被传递给该方法,以便它根据“搜索查询”更改基础序列。

据推测,temp.blocks[temp.blocks == 14 | temp.blocks == 15] = 52 也可以 也可以工作,前提是特殊对象实现了 __or__ hook ;它可以实现 __and__ hook使 & 也能正常工作。

|& 可以被支持的原因是 orand 不能被钩子(Hook)覆盖(这些短路,钩子(Hook)将要求对两个操作数进行评估打破短路预期)。

关于python - 带有属性的奇怪的 python 列表语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18085457/

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