Эквивалент ruby ​​obj.send в python

В ruby, если у меня есть объект obj, с помощью метода funcname, я могу вызвать метод, используя следующий синтаксис obj.send(имя_функция)

Есть ли что-то подобное в python.

Причина, по которой я хочу это сделать, что у меня есть оператор switch, где я устанавливаю имя funcname и хочу называть его в конце инструкции switch.

Ответ 1

getattr(obj, "name")(args)

Ответ 2

hmmm... getattr (obj, funcname) (* args, ** kwargs)?

>>> s = "Abc"

>>> s.upper()
'ABC'

>>> getattr(s, "upper")()
'ABC'

>>> getattr(s, "lower")()
'abc'

Ответ 3

Помимо уже упомянутого getattr() встроенного:

В качестве альтернативы циклу if-elif-else вы можете использовать словарь для сопоставления своих "случаев" с желаемыми функциями/методами:

# given func_a, func_b and func_default already defined
function_dict = {
    'a': func_a,
    'b': func_b  
}
x = 'a'
function_dict(x)() # -> func_a()
function_dict.get('xyzzy', func_default)() # fallback to -> func_c

Относительно методов вместо простых функций:

  • вы можете просто включить приведенный выше пример в method_dict, используя, например, lambda obj: obj.method_a() вместо function_a и т.д., а затем выполните method_dict[case](obj)
  • вы можете использовать getattr(), как уже упоминались другие ответы, но вам это нужно только в том случае, если вам действительно нужно получить метод от его имени.
  • operator.methodcaller() из stdlib является хорошим ярлыком в некоторых случаях: на основе имени метода и необязательно некоторых аргументов он создает функцию, которая вызывает метод с этим именем на другом объекте (и если вы предоставили какие-либо дополнительные аргументы при создании methodcaller, он будет вызывать метод с этими аргументами)

Ответ 4

Или, если хотите, operator.methodcaller('foo') - это функция, которая вызывает foo на все, что вы передаете. Другими словами,

import operator
fooer = operator.methodcaller("foo")
fooer(bar)

эквивалентно

bar.foo()

(Я думаю, что это, вероятно, сопряженное или двойное в подходящей категории. Если вы математически склонны.)