Ссылка на функцию Python по входной строке - PullRequest
1 голос
/ 02 июня 2019

У меня есть модуль Python, в котором есть несколько функций, и он должен вызывать разные функции в зависимости от ввода пользователя. Например, в моем коде у меня есть что-то вроде:

if val == "X":
    return foo.X(self)
elif val == "Y":
    return foo.Y(self)
elif val == "Z":
    return foo.Z(self)
else:
    sys.exit("ERROR: value %s DNE"%(val))

Есть ли способ просто вызвать функцию python в модуле foo, основанную на вводе напрямую, без нескольких if операторов?

Ответы [ 2 ]

2 голосов
/ 02 июня 2019

Использование getattr:

class Foo:
    def X(self): return 1
    def Y(self): return 2

foo = Foo()
getattr(foo, 'X')()
1

Это работает, потому что функции также являются атрибутами объектов. Затем функцию можно вызывать как обычно.

Но будьте осторожны, вы захотите обработать ситуации, когда переданная строка не соответствует ни одной функции в Foo. В этом случае вы можете использовать getattr с необязательным третьим аргументом:

getattr(foo, 'abcd', lambda : None)()
# None

Лямбда возвращается, когда атрибут с таким именем не найден.

0 голосов
/ 02 июня 2019

Вы можете использовать обычный способ Python, чтобы избежать использования оператора switch, используемого на других языках: словарь.Функции являются объектными, поэтому функция может быть значением в словаре.

function_dict = {'X': foo.X, 'Y': foo:Y, 'Z': foo.Z}
return function_dict[val](self)

Если val не является одним из ключей в словаре, возникнет ошибка.Если вы не хотите эту конкретную ошибку, есть несколько способов вызвать еще одну ошибку или вообще избежать ошибок.Например, вы можете использовать метод словарей get, чтобы использовать значение по умолчанию, если ключ отсутствует в словаре.Например, если вы хотите, чтобы метод foo.other вызывался для любого ключа, кроме X, Y, Z, вы можете использовать

function_dict = {'X': foo.X, 'Y': foo:Y, 'Z': foo.Z}
return function_dict.get(val, other)(self)

. Перед использованием словаря вы также можете проверить, является ли val одним изклавиши, как в

function_dict = {'X': foo.X, 'Y': foo:Y, 'Z': foo.Z}
if val not in function_dict:
    sys.exit("ERROR: value %s DNE"%(val))
return function_dict[val](self)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...