Какая польза от определения функции в функции в Python? - PullRequest
30 голосов
/ 22 июля 2011

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

Ответы [ 3 ]

67 голосов
/ 22 июля 2011

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

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

7 голосов
/ 22 июля 2011

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

6 голосов
/ 22 июля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...