Dennis Dennis - 21 days ago 7
Python Question

What is the difference between the apply() function and a function call using the object of the class?

Consider Atom to be a class where


  • form.name is a string

  • convert returns a list of values



What is the difference between the following two lines?


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



From documentation,


apply(...)
apply(object[, args[, kwargs]]) -> value

Call a callable object with positional arguments taken from the tuple args,
and keyword arguments taken from the optional dictionary kwargs.
Note that classes are callable, as are instances with a call() method.


I am not able to understand the difference between the two lines. I am trying to find an equivalent code for
apply(Atom, [form.name] + list([convert(arg, subst) for arg in list(form.args)]))
in Python 3.5

Answer

apply is an old-school1 way of unpacking arguments. In other words, the following all yield the same results:

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

Since you're working in python3.5 where apply no longer exists, the option is not valid. Additionally, you're working with the arguments as a list so you can't really use the third option either. The only option left is the second one. We can pretty easily transform your expression into that format. The equivalent in python3.5 would be:

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

1It was deprecated in python2.3!