2015-07-21 106 views
2

我正在處理嵌套函數有4級嵌套的Python代碼。你可以看到下面的例子:如何避免嵌套函數的多級嵌入

class TestClass: 
    def __init__(self): 
     pass 
    def calculate(self, x, y): 
     results = [] 

     result = None 
     context = API.send_request('get_context') 
     if context['result'] == 'ok': 
      result = context['data'] 
     # Some more actions here 

     def _is_valid_variable(variable): 
      if (variable > 0 and 
       variable % 2 == 0 and 
       variable < 10): 
       return True 

      return False 

     def _format_data(data): 
      formatted_data = None 

      def _extract_time(line): 
       time = None 

       if line: 
        time = line.split('|')[-1] 

       return time 

      if data: 
       for line in data.split('\n'): 
        formatted_data += '[DEBUG] [{0}] {1}'.format(_extract_time(line), line.split('|')[1]) 

      return formatted_data 


     return results 

在這個例子中只有3個層次,但想法是相同的。

構建此類代碼的更好方法是什麼?

將所有閉包/內部函數放在父函數的開始處不要混合代碼更好嗎?

P.S.我不想把這些功能放到班級的水平上,只要他們實際上與班級沒有關係,而只與他們的家長功能有關。

+2

[*「Flat比嵌套更好。」*](https://www.python.org/dev/peps/pep-0020/)您的嵌套函數似乎不需要閉包,根本不需要嵌套。 – jonrsharpe

+0

^- +1,我看不到任何你需要「嵌套」功能的原因,簡單的類方法或staticmethod會做得很好。不要讓你的代碼複雜化。 – Anzel

+0

如果函數是在一個函數內部定義的,那麼每次函數運行時_redefined。這會讓你的功能變慢,沒有理由。 – RemcoGerlich

回答

1

這些都是普通函數,既不依賴於您的類或實例,也不依賴於調用函數的上下文,因此只需將它們放在模塊的頂層即可。