2015-09-11 47 views
-2

我移植一个python脚本到.NET,使其更容易十个分量,这是我第一次真正做任何事情在python,所以我严重计算器检查,每行我不明白,我可以” t似乎完全可以解决这个问题。当处理程序设置为None时,python getattr会返回处理程序吗?

我这得到由getattr()设定时的名字是无处理程序对象?

据我可以从阅读的代码,因为它的上面设置不当那么,是什么在getattr()实际上在这里做的名字将永远没有告诉?

如果指令对象是None? (我想这是像空/没有?)不会它击中getattr()线之前提出一个异常,然后我再也不相信指令都不能是无,如果记忆是无串看上去依然像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 

约30线向下蟒蛇处理程序用在这里最后一次。

if handler(instruction) is False: 
     self.on_fail('Handler skipped', instruction) 

似乎现在的处理器可以接受指令I类找不到具有__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

您是否阅读过文档? ['getattr'](https://docs.python.org/2/library/functions.html#getattr)从对象获取属性,第三个参数'None'是默认值,以防没有请求的属性。 'getattr'不是一个二传手。 –

+0

这些文件对我来说很难理解,我无法将英文连接与实际理解联系起来,所以我将所有的知识都用在了线索和错误上,而且我通常会将其弄清楚 – SSpoke

回答

0

好吧看来你使用getattr()映射通过字符串名称函数调用到一个处理函数,它是你试图映射的函数的包装器。