我在effbot遇到了这段python代码(粘贴在下面),我想知道:
为什么在函数中定义函数?
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)
答案 0 :(得分:67)
为什么在函数中定义函数?
保持孤立。它只用在这一个地方。为什么在本地使用时更全局地定义它?
答案 1 :(得分:7)
这只是将大型函数分解为更小的部分而不用另一个函数名称污染全局命名空间的另一种方法。内部函数通常不是独立函数,因此不能正确地属于全局名称空间。
答案 2 :(得分:6)
此类代码的主要原因通常是函数closures。它是强大的东西,不仅适用于Python。例如。 JavaScript从中获益匪浅。
有关Python中闭包的一些观点 - closures-in-python。