apply() 函数和使用类对象进行函数调用有什么区别?

8
考虑Atom作为一个类,其中
- form.name是一个字符串 - convert返回一个值列表
以下两行代码有什么区别?
- apply(Atom,[form.name]+list([convert(arg,subst) for arg in list(form.args)])) - Atom(form.name,[convert(arg, subst) for arg in form.args])
从文档中可以得知:
apply(…) apply(object [,args [,kwargs]]) - > value 用元组args中的位置参数和可选字典kwargs中的关键字参数调用可调用对象。 注意,类是可调用的,带有call()方法的实例也是可调用的。
我无法理解这两行代码之间的区别。我正在尝试在Python 3.5中找到 apply(Atom,[form.name] + list([convert(arg,subst) for arg in list(form.args)])) 的等效代码。
1个回答

19

apply 是一种老式的1方法,用于解包参数。换句话说,以下所有方式都会产生相同的结果:

results = apply(foo, [1, 2, 3])
results = foo(*[1, 2, 3])
results = foo(1, 2, 3)

由于您正在使用python3.5,其中apply不再存在,因此选项无效。此外,您正在使用参数列表,因此第三个选项也不能使用。仅剩下第二个选项。我们可以很容易地将您的表达式转换为该格式。在python3.5中的等效代码如下:

Atom(*([form.name] + [convert(arg, subst) for arg in list(form.args)]))

1它在Python2.3中被弃用了!


它可以工作...但是你能告诉我这里使用了哪个概念,以便我可以阅读相关内容吗?什么是Atom(...)?代表什么? - Naveen Dennis
明白了!https://dev59.com/HHVD5IYBdhLWcg3wQZUg - Naveen Dennis
1
@Dennis -- 这就是现代 Python 中我们如何解包参数的方式。我已经在上面添加了一个链接,你可以在 Python 教程中阅读更多相关内容。 - mgilson
3
@Dennis--此外,请小心您发布的链接。具体而言,该链接指定了在函数定义点处使用*的含义。这个问题更多地是关于在函数调用点处使用*的含义。它们是密切相关的概念(足够相关,以至于在您使用它一段时间后很容易忽略它们是不同的),但它们是可以分别理解的不同的东西。 - mgilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接