2011-07-22 13 views
27

私はeffbot上(以下貼り付け)Pythonコードのこの部分が発生し、私は思っていた: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) 

答えて

60

この場所でのみ使用されます。ローカルで使用されている場合、よりグローバルに定義するのはなぜですか?

+1

クロージャを使用するために内部関数を定義するのはかなり一般的ですが、現在のケースは、あなたが言及したものであるようです(それは良い理由もあります)。エルゴ、+1 – brandizzi

4

これは、グローバル名前空間を別の関数名で汚染することなく、大きな関数をより小さな部分に分解する別の方法です。多くの場合、内部関数はスタンドアロンではないため、グローバル名前空間に正当に属しません。

4

多くの場合、そのようなコードの主な理由は、機能closuresです。それはPythonだけでなく、強力なものです。例えば。 JavaScriptはそれらから多くの利益を得ます。

Pythonのクロージャに関するいくつかの点 - closures-in-python

関連する問題