Отложенная оценка в Python - PullRequest
       23

Отложенная оценка в Python

8 голосов
/ 19 февраля 2010

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

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

Ответы [ 2 ]

14 голосов
/ 19 февраля 2010

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

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 возвращает набор имен файлов и "thunk" (лямбда без аргументов), которая возвращает содержимое файла. «Thunk» - это отложенная оценка. Использование thunks позволяет разделить ваши проблемы:

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

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

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

8 голосов
/ 19 февраля 2010

Хороший ответ Дитриха, но я просто хочу добавить, что самой простой формой отложенной оценки является утверждение 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 был определенного типа с атрибутом contents. В Python из-за отложенной оценки операторов в if это не обязательно верно. stuff может быть None, который явно не имеет атрибутов, и интерпретатор просто примет предложение else без выполнения первого. Следовательно, это действительно Python и даже идиома, которая делает код проще.

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

...