Задержанная оценка в Python

Я услышал о задержанной оценке в Python (например, здесь), это просто относится к тому, как лямбды оценены интерпретатором только, когда они используются? Или действительно ли это - надлежащий термин для описания, как, из-за динамического дизайна Python, это не зафиксирует много ошибок до времени выполнения?

Или я пропускаю что-то полностью?

8
задан C-o-r-E 19 February 2010 в 05:18
поделиться

2 ответа

Ответ Дитриха хороший, но я просто хочу добавить что простейшей формой отложенной оценки является оператор if :

if True:
  x = 5
else:
  x = y    # huh? what is y?

Этот код анализирует и работает правильно, хотя предложение else не имеет смысла - y равно неопределенный. Предложение else только анализируется, поэтому оно должно быть синтаксически допустимым для Python. Это может быть фактически использовано для некоторого простого кода:

if stuff:
   print stuff.contents
else:
   print "no stuff"

На строго типизированном языке это не сработает, потому что для ввода stuff.contents требуется stuff определенного типа с атрибутом content . В Python из-за отложенной оценки операторов в if это не обязательно верно. материал может быть None , который, очевидно, не имеет атрибутов, и интерпретатор просто возьмет предложение else , не выполняя первое. Следовательно, это действительный Python и даже идиома, упрощающая код.

Ссылка на обсуждение

8
ответ дан 5 December 2019 в 07:34
поделиться

Отложенная оценка - это когда выражение не оценивается до тех пор, пока оно не понадобится. В большинстве языков вы используете что-то вроде лямбда , чтобы это работало. Вот надуманный пример, демонстрирующий часть концепции:

def list_files():
    for fn in os.listdir('.'):
        yield fn, lambda: open(fn, 'r').read()


for fn, body in list_files():
    if fn.endswith('.txt'):
        print body()

Здесь list_files возвращает набор имен файлов и «преобразователь» (лямбда без аргументов), который возвращает содержимое файла. Преобразователь - это отложенная оценка. Использование преобразователей позволяет разделить ваши проблемы:

  • Циклу for не нужно знать, как читать файлы, поэтому list_files можно заменить на list_ftp_files или list_zip_archive .
  • Функция list_files не должна знать, какие файлы будут прочитаны. С thunks ему не нужно читать каждый файл.

При правильной отложенной оценке, как только вы оцениваете «преобразователь», он заменяет себя оцененной копией, поэтому оценка его дважды будет не больше работы, чем оценка его один раз. Есть и другие способы сделать то же самое, например, с классами и объектами, которые кэшируют значения.

Отложенная оценка - (относительно) обычная идиома в Scheme. В Haskell оценки по умолчанию откладываются, и для этого вам не нужен какой-либо синтаксис (для его отключения есть специальный синтаксис).

14
ответ дан 5 December 2019 в 07:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: