如果处理程序设置为None,python getattr会返回处理程序吗?

时间:2015-09-11 00:18:32

标签: python handler getattr

我将一个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()用于通过字符串名称映射到函数调用

1 个答案:

答案 0 :(得分:0)

好吧,似乎你使用getattr()将字符串名称的函数调用映射到处理函数,该处理函数是你试图映射的函数的包装器。