python getattr returns 到处理程序,什么时候处理程序设置为 None?

python getattr returns to handler when exactly is handler set to None?

我正在将 python 脚本移植到 .NET 以使其更易于维护,这是我第一次在 python 中实际做任何事情,所以我正在大量检查 Whosebug每一行我都不明白,我似乎根本无法弄明白。

当名称为 None?

时,我得到了一个由 getattr() 设置的处理程序对象

据我阅读代码可以看出,名称永远不会像上面正确设置的那样 None 那么 getattr() 在这里实际上做了什么?

如果指令对象是None? (我想这就像 null/Nothing?)它不会在到达 getattr() 行之前引发异常然后我不相信指令可以是 None,如果助记符是 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)

现在似乎处理程序可以接受指令 Class 我找不到任何处理程序 class 其中也有 __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() 用于通过字符串名称映射到函数调用

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