2015-09-11 3 views
-2

Я портирую скрипт python на .NET, чтобы упростить работу, и это первый раз, когда я на самом деле что-то делаю на python, поэтому я сильно проверяю stackoverflow для каждой строки, которую я не понимаю, и я могу " Кажется, это вообще не видно.python getattr возвращается к обработчику, когда именно обработчик установлен в 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 

около 30 строк вниз в python обработчик используется в последний раз здесь.

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

Вы прочитали документацию? ['getattr'] (https://docs.python.org/2/library/functions.html#getattr) получает атрибут от объекта, а третий аргумент' None' - значение по умолчанию в случае отсутствия запрашиваемого атрибута , 'getattr' не является сеттер. –

+0

Эти документы мне очень трудно понять, я не могу свести связь с английского на реальное понимание, поэтому я основываю все свои знания на тропе и ошибках, и обычно я это выясняю – SSpoke

ответ

0

Хорошо, что вы используете getattr() для отображения вызовов функций по имени строки к функции обработчика, которая является оберткой для функции, которую вы пытаетесь отобразить.