2016-11-17 113 views
0

考虑的Atom是一个类,其中apply()函数和使用类对象的函数调用有什么区别?

  • 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])

从技术文档,

申请(...) 申请(对象[,ARGS [,kwargs]]) - >值
调用a可调用对象,其中包含来自元组参数的位置参数 以及从可选字典kwargs中取得的关键字参数。 请注意,类可以调用,如调用()方法。

我无法理解两行之间的区别。我想在Python 3.5

回答

2

apply找到apply(Atom, [form.name] + list([convert(arg, subst) for arg in list(form.args)]))等效代码是一个老派的unpacking arguments 方式。换句话说,下面都产生相同的结果:

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)])) 

这是在python2.3弃用!

+0

它的工作原理..但你能告诉我在这里使用哪个概念,以便我可以阅读它。什么是原子(* ...)? *代表什么? –

+0

明白了! http://stackoverflow.com/questions/36901/what-does-double-star-and-star-do-for-parameters –

+1

@丹尼斯 - 这就是我们现在如何在现代python中解压参数。我已经在上面添加了一个链接,你可以在python教程中阅读更多关于 – mgilson

相关问题