有人可以解释函数 getattr(Object, function) 在传递变量时如何工作吗?

Could someone please explain how the function getattr(Object, function) works when passed variables?

所以我正在研究一些 hackerrank 问题,有人发布了以下代码片段作为解决方案的一部分,我很好奇是否有人可以向我解释一下?

getattr(l, parts[0])(*(map(int, parts[1:])))

在以下线程中:

Python using getattr to call function with variable parameters

Mgilson 提到这可以对任何 function/method 完成,我感到困惑。

在 getattr() 文档中,我没有发现在函数后传递 *args 的信息,因此感到困惑。这种方法是否普遍适用于所有功能?如果是这样,有人可以提供一些基本示例并解释为什么这是真的吗?

非常感谢!

您不会在 getattr 的文档中找到它,因为通过 使用 * 运算符的函数参数是完全不同的 东西。

此代码:

l = "my_fun"
getattr(l, parts[0])(*(map(int, parts[1:])))

实际上等同于:

l = "my_fun"
fun = getattr(l, parts[0])
fun(*(map(int, parts[1:])))

你得到了名为my_fun的函数,然后调用这个函数。 map(int, parts[1:])parts[1:] 的项目映射到整数,然后 * 运算符解压缩这些整数以将它们用作 fun.

的参数

所以只要调用的函数有多个 参数等于 len(parts[1:]).

这是另一个包含两个文件的示例。

#  my_pack/__init__.py

def fun1(x):
    print('x =', x)

def fun2(x, y):
    print('x =', x, ', y =', y)


#  test.py
import my_pack

args = [1]
fun = getattr(my_pack, 'fun1')
fun(*args)

#  equivalent solution
fun = getattr(my_pack, 'fun1')(*args)

args = [1, 2]
fun = getattr(my_pack, 'fun2')(*args)

@mgilson说的就是这个调用函数的原理 没有明确列出它的所有参数,而是使用 * 运算符完全独立于 getattr。比如这里 我不使用 getattr:

的地方
def my_cool_func(a, b, c):
   print(a, b, c)

my_cool_func(*[1, 2, 3])  #  prints "1 2 3"