我目前正在学习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
但它根本不起作用。你知道吗
我知道还有其他的方法,但这一种特别简单,紧凑,高效,我想了解它是如何工作的。你知道吗
底层
blocks
类的作者已经替换了各种Python表达式的normal语义,以实现一种小型查询语言。你知道吗很可能,} 和^{} 钩子。你知道吗
blocks
类重写了^{temp.blocks == 14
表达式由__eq__
钩子处理,并返回某种特殊对象,然后通过[...]
语法传递给__setitem__
钩子。然后__setitem__
钩子使用这个特殊对象来确定序列中要修改的索引。你知道吗==
运算符在任一操作数上查找__eq__
方法,如果存在,则调用该方法并返回值(通常为True
或False
),作为该相等性测试的结果。但是,temp.blocks
上的__eq__
方法返回一些其他;而且'something'还可以实现额外的钩子(例如__or__
和__and__
),以便进一步细化查询语言。你知道吗temp.blocks[expr1] = expr2
赋值被转换为blocks.__setitem__(expr1, expr2)
,因此blocks.__eq__(14)
的结果被传递给该方法,以便该方法基于“搜索查询”更改基础序列。你知道吗可以猜测,} hook ;它可以实现^{} hook ,使
temp.blocks[temp.blocks == 14 | temp.blocks == 15] = 52
也可以工作,前提是特殊对象实现了^{&
也可以工作。你知道吗可以支持
|
和&
的原因是or
和and
不能用钩子重写(这些短路,钩子需要对两个操作数进行求值,以打破短路期望)。你知道吗相关问题 更多 >
编程相关推荐