问题描述
所以我正在研究一些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"