Является ли exec Python аналогом Схемы `apply`? - PullRequest
0 голосов
/ 16 января 2020

Я нашел встроенную функцию Python eval, но не смог найти функцию, аналогичную apply.

схемы. Я исчерпывающе изучил другие ключевые слова Python, но ни одного из них соответствуют apply.

Кандидатом может быть exec:

In [14]: eval("print('testing')")      
testing
In [15]: exec("print('testing')")      
testing

и на схеме:

> (eval '(display 'testing))
testing
> (apply display '(testing))
testing

Является Python exec аналогом схемы apply

Ответы [ 2 ]

2 голосов
/ 21 января 2020

Определить, применить в Python:

def apply(f, arg_list):
    return f(*arg_list)

Пример схемы:

(define (pythagoras a b)
  (sqrt (+ (* a a) (* b b))))

(apply pythagoras '(3 4))  ; Returns: 5

Аналог Python Пример:

import math

def pythagoras(a, b):
    return math.sqrt(a**2 + b**2)

apply(pythagoras, [3, 4])  # Returns: 5.0

Дополнительные примечания (исходя из вашего очевидного интереса к таким вещам)

Python eval:

eval('pythagoras(3, 4)')

Принимая во внимание, что на схеме:

(eval '(pythagoras 3 4))
(eval "Hello")
(eval `(,(if (> x 0) + -) 100 ,(pythagoras 3 4)))

Как видите, Python eval требует от вас возиться со строками, байтами или «объектами кода». Схема eval принимает Схему. См .: Что именно означает гомоиконичность?

Возможно, вас заинтересует чтение о Метациркулярный оценщик (из Структура и интерпретация компьютерных программ, глава 4, Metalinguisti c Abstractions), чтобы увидеть значение схем eval и apply.

Обратите внимание, что использование eval в Python крайне не рекомендуется (и если вы действительно необходимо использовать его, рассмотрим ast.literal_eval ). На обоих языках обычно рекомендуется избегать eval, если ваша проблема может быть решена с помощью других методов.

2 голосов
/ 21 января 2020

Нет. Схема apply используется для применения функции к аргументам, хранящимся в списке. Python способ сделать это - *, а не exec:

>>> args = [1, 2, 3]
>>> print(*args)
1 2 3

Python , используемый для с функцией apply, соответствующей схеме apply, но оно было удалено в пользу * обозначения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...