我将一个python脚本移植到.NET以使其更容易保持,这是我第一次真正在python中执行任何操作,所以我正在大量检查每个行的堆栈溢出我不会#39理解,我似乎无法解决这个问题。
我有一个处理程序对象,当名称为None时,由getattr()
设置?
据我所知,通过阅读代码,名称将永远不会为“无”,因为它已正确设置,因此getattr()
实际上在这里做了什么?
如果指令对象是None? (我想这就像null / Nothing?)在点击getattr()
行之前不会引发异常然后我再也不相信指令可以是None,如果是助记符如果字符串看起来仍然是on_
,那么name
在技术上永远不会是None
。所以处理程序永远不会是None
那么为什么它可以在这里?
name = 'on_%s' % instruction.mnemonic
handler = getattr(self, name, None)
if handler is None:
self.on_fail('Not implemented', instruction)
return False
python中约有30行,最后一次使用处理程序。
if handler(instruction) is False:
self.on_fail('Handler skipped', instruction)
现在似乎处理程序可以接受一个指令类,我找不到任何包含__init__
指令的处理程序类。
稍微想象它似乎与一些全局函数映射器一起使用
on_cmovae = on_cmovcc
on_cmova = on_cmovcc
on_cmovbe = on_cmovcc
on_cmovb = on_cmovcc
on_cmovg = on_cmovcc
on_cmovge = on_cmovcc
on_cmovl = on_cmovcc
on_cmovle = on_cmovcc
on_cmove = on_cmovcc
on_cmovne = on_cmovcc
on_cmovs = on_cmovcc
映射回函数
def on_cmovcc(self, i):
self.writer.putlnc('if (%s)', i.get_condition_value())
self.writer.indent()
self.set_op(i.op1, i.op2.get())
self.writer.dedent()
好吧似乎getattr()用于通过字符串名称映射到函数调用
答案 0 :(得分:0)
好吧,似乎你使用getattr()
将字符串名称的函数调用映射到处理函数,该处理函数是你试图映射的函数的包装器。