有人可以解释传递变量时函数getattrObject,function如何工作吗?

问题描述

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

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

在以下线程中:

Python using getattr to call function with variable parameters

Mgilson提到可以针对任何功能/方法完成此操作,这让我感到困惑。

在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,c)

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