У вас есть несколько проблем здесь.
Во-первых, в этой строке:
functions = {"Test1":test1, "Test2":test2}
В то время Python выполняет эту строку кода, нет ничего называют test1
или test2
, так что вы собираетесь получить немедленный NameError
. Если вы хотите так поступать, у вас будет определение functions
после все функции были определены, а не раньше.
Далее, на той же линии, test1
и test2
на данный момент являются набившие оскомину функции. Но вы пытаетесь назвать их так, как если бы они были методами, с магией self
и все остальное. Это не сработает.Если вы понимаете, как работают методы, это должно быть очевидно, что вы можете обойти это в call_me
метода:.
def call_me(self, arg): self.functions[arg].__get__(self, type(self))(arg)
(В этом случае, вы можете уйти только с явно передавая self
как дополнительный аргумент Но убедитесь, что вы понимаете, почему, прежде чем делать это.)
Наконец, вы пытаетесь вызвать call_me
с функцией test1
, вместо имени 'Test1'
. Предположительно вся причина, как вы создали это отображение так, что вы можете использовать имена (динамически, как строки), так что давайте на самом деле их использовать:
t.call_me('Test1')
Обратите внимание, что если единственная причина, вы можете» t use getattr
заключается в том, что имена исполняемых файлов, которые вы хотите просмотреть, не совпадают с именами методов, которые вы хотите определить, вы всегда можете иметь карту строк для строк и искать полученные строки с помощью getattr
, что позволяет избежать всех другие проблемы здесь. Заимствования из aruisdante's answer, добавляя в поиск имени и запоминания передать arg
:
functions = {"Test1": "test1", "Test2": "test2"}
def call_me(self, arg):
return getattr(self, self.functions[arg])(arg)
Упреждайте вас за предложение статической str: str-карты для решения проблемы произвольного сопоставления при использовании 'getattr' для решения проблемы привязки. – aruisdante
@aruisdante: И ни один нисходящий знак для неправильного написания вашего имени в ссылке? :) Я пойду исправить это ... – abarnert