Давайте рассмотрим три распространенные причины написания внутренних функций.
1. Затворы и заводские функции
Значение во вложенной области видимости запоминается, даже когда переменная выходит из области действия или сама функция удаляется из текущего пространства имен.
def print_msg(msg):
"""This is the outer enclosing function"""
def printer():
"""This is the nested function"""
print(msg)
return printer # this got changed
Теперь давайте попробуем вызвать эту функцию.
>>> another = print_msg("Hello")
>>> another()
Hello
Это необычно. Функция print_msg()
была вызвана со строкой "Hello"
, а возвращаемая функция была связана с именем another
. При вызове another()
сообщение все еще запоминалось, хотя мы уже завершили выполнение функции print_msg()
. Этот метод, с помощью которого некоторые данные ("Hello"
) привязываются к коду, в Python называется замыканием.
Когда использовать закрытие?
Так, для чего хороши затворы? Замыкания могут избежать использования глобальных значений и предоставляют некоторую форму сокрытия данных. Он также может предоставить объектно-ориентированное решение проблемы. Когда в классе реализовано мало методов (в большинстве случаев один метод), замыкания могут обеспечить альтернативные и более элегантные решения. Reference
2. Инкапсуляция:
Общая концепция инкапсуляции заключается в том, чтобы скрывать и защищать внутренний мир от внешнего. Здесь внутренние функции доступны только внутри внешнего и защищены от всего, что происходит вне функции.
3. Keepin 'it DRY
Возможно, у вас есть гигантская функция, которая выполняет один и тот же кусок кода во многих местах. Например, вы можете написать функцию, которая обрабатывает файл, и вы хотите принять либо открытый объект файла, либо имя файла:
def process(file_name):
def do_stuff(file_process):
for line in file_process:
print(line)
if isinstance(file_name, str):
with open(file_name, 'r') as f:
do_stuff(f)
else:
do_stuff(file_name)
Более подробно вы можете обратиться к этому блогу.