Ответ 1
Зачем определять функцию внутри функции?
Чтобы он был изолирован. Он используется только в одном месте. Зачем определять его глобально, когда он используется локально?
Я столкнулся с этим фрагментом кода python (вставленным ниже) на effbot, и мне было интересно:
Зачем определять функцию внутри функции?
import re, htmlentitydefs
##
# Removes HTML or XML character references and entities from a text string.
#
# @param text The HTML (or XML) source text.
# @return The plain text, as a Unicode string, if necessary.
def unescape(text):
def fixup(m):
text = m.group(0)
if text[:2] == "&#":
# character reference
try:
if text[:3] == "&#x":
return unichr(int(text[3:-1], 16))
else:
return unichr(int(text[2:-1]))
except ValueError:
pass
else:
# named entity
try:
text = unichr(htmlentitydefs.name2codepoint[text[1:-1]])
except KeyError:
pass
return text # leave as is
return re.sub("(?s)<[^>]*>|&#?\w+;", fixup, text)
Зачем определять функцию внутри функции?
Чтобы он был изолирован. Он используется только в одном месте. Зачем определять его глобально, когда он используется локально?
Часто основной причиной такого кода является функция закрытия. Это мощная вещь, которая применима не только к Python. Например. JavaScript много от них выигрывает.
Некоторые моменты закрытия в Python - closures-in-python.
Это просто еще один способ разбить большую функцию на более мелкие части, не загрязняя глобальное пространство имен другим именем функции. Довольно часто внутренняя функция не является автономной, поэтому не справедливо принадлежит глобальному пространству имен.