2016-11-17 3 views
0

Рассмотрим Atom быть классом, гдеВ чем разница между функцией apply() и вызовом функции с использованием объекта класса?

  • form.name является строкой
  • новообращенный возвращает список значений

В чем разница между следующими двумя линиями?

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

Из документации,

применяются (...) применить (объект [, арг [, kwargs]]) -> значение
Позвонить вызываемый объект с позиционными аргументами, взятыми из кортежей args, и аргументы ключевых слов, взятые из необязательного словаря kwargs. Обратите внимание, что классы вызываются, как и экземпляры с вызовом ().

Я не могу понять разницу между двумя линиями. Я пытаюсь найти эквивалентный код для apply(Atom, [form.name] + list([convert(arg, subst) for arg in list(form.args)])) в Python 3.5

ответ

2

apply является старой школой путем 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

Это работает .. но можете ли вы сказать мне, какая концепция используется здесь, чтобы я мог прочитать об этом. Что такое Atom (* ...)? Что представляет собой *? –

+0

Получил! http://stackoverflow.com/questions/36901/what-does-double-star-and-star-do-for-parameters –

+1

@Dennis - Вот как мы теперь распаковываем аргументы в современном python. Я добавил ссылку выше, где вы можете прочитать больше об этом в учебнике python. – mgilson

 Смежные вопросы

  • Нет связанных вопросов^_^