奇怪的python列表语法和attribu

2024-05-29 02:02:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在学习python,为mceditpython程序编写过滤器,这是Minecraft的一个3D块编辑器。 过滤器是可以在程序内部作为函数运行的一小段代码。你知道吗

MCedit提供的函数之一允许导出一个原理图(这里称为temp)来修改它。在演示中,程序的创建者通过以下行修改原理图的块属性:

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

.blocks属性由3层(x,y,z)上的串联列表组成。你知道吗

这段代码替换任何列表中等于14乘52的任何值。你知道吗

我试图让它改变其他价值观,包括:

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

但它根本不起作用。你知道吗

我知道还有其他的方法,但这一种特别简单,紧凑,高效,我想了解它是如何工作的。你知道吗


Tags: 函数代码程序过滤器列表属性编辑器temp
1条回答
网友
1楼 · 发布于 2024-05-29 02:02:47

底层blocks类的作者已经替换了各种Python表达式的normal语义,以实现一种小型查询语言。你知道吗

很可能,blocks类重写了^{}^{}钩子。你知道吗

temp.blocks == 14表达式由__eq__钩子处理,并返回某种特殊对象,然后通过[...]语法传递给__setitem__钩子。然后__setitem__钩子使用这个特殊对象来确定序列中要修改的索引。你知道吗

==运算符在任一操作数上查找__eq__方法,如果存在,则调用该方法并返回值(通常为TrueFalse),作为该相等性测试的结果。但是,temp.blocks上的__eq__方法返回一些其他;而且'something'还可以实现额外的钩子(例如__or____and__),以便进一步细化查询语言。你知道吗

temp.blocks[expr1] = expr2赋值被转换为blocks.__setitem__(expr1, expr2),因此blocks.__eq__(14)的结果被传递给该方法,以便该方法基于“搜索查询”更改基础序列。你知道吗

可以猜测,temp.blocks[temp.blocks == 14 | temp.blocks == 15] = 52也可以工作,前提是特殊对象实现了^{} hook;它可以实现^{} hook,使&也可以工作。你知道吗

可以支持|&的原因是orand不能用钩子重写(这些短路,钩子需要对两个操作数进行求值,以打破短路期望)。你知道吗

相关问题 更多 >

    热门问题