Python закрывает пример кода

Я изучаю Python с помощью Погружения В книгу Python 3. Мне нравится он, но я не понимаю, что пример раньше представлял Закрытия в Разделе 6.5.

Я имею в виду, я вижу, как это работает, и я думаю, что это действительно прохладно. Но я не вижу реальной выгоды: это кажется мне, тот же результат мог быть достигнут путем простого чтения в файле правил линию за линией в цикле и выполнения поиска / замена для каждого чтения строки.

Мог кто-то помогать мне к:

  • или поймите, почему использование закрытий в этом примере улучшает код (например, легче поддержать, расширьте, снова используйте, или отладка?)

  • или предложите источник некоторых других реальных примеров кода, где закрытия действительно сияют?

Спасибо!

13
задан Niels Bom 1 July 2013 в 13:33
поделиться

3 ответа

Декораторы являются примером замыканий. Например,

def decorate(f):
    def wrapped_function():
        print("Function is being called")
        f()
        print("Function call is finished")
    return wrapped_function

@decorate
def my_function():
    print("Hello world")

my_function()

Функция wrapped_function является замыканием, поскольку она сохраняет доступ к переменным в своей области видимости - в частности, к параметру f, исходной функции. Именно замыкания позволяют получить к ней доступ.

Замыкания также позволяют сохранять состояние при разных вызовах функции, не прибегая к помощи класса:

def make_counter():
    next_value = 0
    def return_next_value():
        nonlocal next_value
        val = next_value
        next_value += 1
        return val
    return return_next_value

my_first_counter = make_counter()
my_second_counter = make_counter()
print(my_first_counter())
print(my_second_counter())
print(my_first_counter())
print(my_second_counter())
print(my_first_counter())
print(my_second_counter())

Кроме того, связанные методы технически являются замыканиями (хотя они, вероятно, реализованы по-другому). Связанные методы - это функции-члены класса со своим классом:

import sys
w = sys.stdout.write
w("Hello\n")

w - это, по сути, закрытие со ссылкой на объект sys.stdout.

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

25
ответ дан 1 December 2019 в 20:29
поделиться

Это может показаться не особенно полезным, если у вас есть доступ ко всей кодовой базе или когда вы не имеете в виду возможность повторного использования, но это невероятно мощно и полезно при попытке разделить логику на разные повторно используемые модули, которые могут быть реализованы параллельно разными разработчиками. Если бы вы просто считали строки шаблонов из файла, каждый отдельный модуль должен был бы знать об этом файле и передавать этот раздражающий список строк шаблонов. И если вы измените свою систему так, что строки шаблона будут поступать из URL-адреса, а не из файла, это может полностью нарушить всю вашу кодовую базу.С другой стороны, если вы обрабатываете логику, просто беря функцию обратного вызова или несколько функций обратного вызова, а затем у вас есть другой модуль, который динамически конструирует функции с использованием содержимого из файла, тогда необходимо изменить только компонент, который создает функции. Это сила возможности динамически создавать функции.

2
ответ дан 1 December 2019 в 20:29
поделиться

чтение файла правил построчно в цикле

строка за строкой в цикле

цикл

Это приведет к снижению производительности. Прочитайте один раз, примените много раз.

0
ответ дан 1 December 2019 в 20:29
поделиться
Другие вопросы по тегам:

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