简体   繁体   中英

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

apply is an old-school 1 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)]))

1 It was deprecated in python2.3!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM