Подтвердить что ты не робот

Какая польза для определения функции в функции в python?

Я столкнулся с этим фрагментом кода 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)
4b9b3361

Ответ 1

Зачем определять функцию внутри функции?

Чтобы он был изолирован. Он используется только в одном месте. Зачем определять его глобально, когда он используется локально?

Ответ 2

Часто основной причиной такого кода является функция закрытия. Это мощная вещь, которая применима не только к Python. Например. JavaScript много от них выигрывает.

Некоторые моменты закрытия в Python - closures-in-python.

Ответ 3

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