apply()函数和使用该类的对象的函数调用之间有什么区别?

Nav*_*nis 2 python apply python-2.7 python-3.x

认为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()方法的实例也可以调用

我无法理解两条线之间的区别。我正在尝试apply(Atom, [form.name] + list([convert(arg, subst) for arg in list(form.args)]))在Python 3.5中找到等效的代码

mgi*_*son 8

apply是一个老派1种的方式拆包参数。换句话说,以下所有结果均相同:

results = apply(foo, [1, 2, 3])
results = foo(*[1, 2, 3])
results = foo(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

由于您正在使用apply不再存在的python3.5 ,因此该选项无效。此外,您将参数作为列表使用,因此您也无法真正使用第三个选项。剩下的唯一选择是第二个。我们可以轻松地将您的表达方式转换为该格式。python3.5中的等效项为:

Atom(*([form.name] + [convert(arg, subst) for arg in list(form.args)]))
Run Code Online (Sandbox Code Playgroud)

1在python2.3中已弃用!

  • @Dennis-另外,请谨慎使用您发布的链接。具体来说,该链接指定在函数定义点处具有*的含义。这个问题更多的是关于在函数_call_处有一个*的含义。它们是紧密相关的概念(密切相关,以至于您使用它们一段时间后,很容易忽略它们是不同的事实),但是它们是可以分别理解的独特事物。 (2认同)