与python中的ruby obj.send等效

与python中的ruby obj.send等效,python,send,Python,Send,在ruby中,如果我有一个对象obj,带有一个名为funcname的方法,我可以使用以下语法调用该方法 对象发送(函数名) python中有类似的东西吗 我之所以要这样做,是因为我有一个switch语句,其中我设置了funcname,并希望在switch语句的末尾调用它 getattr(obj, "name")(args) ​​​​ hmmm。。。getattr(对象,函数名)(*args,**kwargs) 除了前面提到的getattr()builtin之外: 作为if-elif-else循

在ruby中,如果我有一个对象obj,带有一个名为funcname的方法,我可以使用以下语法调用该方法 对象发送(函数名)

python中有类似的东西吗

我之所以要这样做,是因为我有一个switch语句,其中我设置了funcname,并希望在switch语句的末尾调用它

getattr(obj, "name")(args)
​​​​

hmmm。。。getattr(对象,函数名)(*args,**kwargs)


除了前面提到的
getattr()
builtin之外:

作为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
关于方法而不是普通函数:

  • 您只需使用例如
    lambda obj:obj.method\u a()
    而不是
    function\u a
    等将上述示例转换为
    method\u dict
    ,然后执行
    method\u dict[case](obj)
  • 正如其他答案已经提到的那样,您可以使用
    getattr()
    ,但只有在确实需要从名称获取方法时才需要它
  • 在某些情况下,stdlib是一个不错的快捷方式:基于方法名和一些可选参数,它创建一个函数,在另一个对象上使用该名称调用该方法(如果在创建methodcaller时提供了任何额外参数,它将使用这些参数调用该方法)

或者,如果您愿意,
操作符。methodcaller('foo')
是一个函数,它可以对您传递的任何内容调用
foo
。换句话说,

import operator
fooer = operator.methodcaller("foo")
fooer(bar)
相当于

bar.foo()

(我认为这可能是一个合适的类别中的伴随或对偶。如果你有数学倾向的话。)

Python没有switch语句。此外,在运行时生成函数名几乎总是一个坏主意。@Rafe:这不是通常需要的,但它本身并没有什么坏处。是的,它不是,但我仍然希望在和if-elif-else循环中这样做。我想我得到了下面的答案。您可以始终只分配函数:“f=obj.func”,然后稍后调用
f(args)
。Python的方法绑定在需要的时候很适合这样做。
bar.foo()