2015-07-21 3 views
2

Я работаю с кодом python, который имеет 4 уровня вложенных функций. Ниже приведен пример:Как избежать нескольких уровней вложенных функций

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

[* «Плоский лучше, чем вложенный». * * (Https://www.python.org/dev/peps/pep-0020/) Ваши вложенные функции не нуждаются в закрытии, t нужно быть вложенным вообще. – jonrsharpe

+0

^- +1, я не вижу причин, по которым вам нужны «вложенные» функции, простые методы класса или staticmethod будут делать все отлично. Не превышайте сложный код. – Anzel

+0

Если функции определены внутри функции, то они изменяются каждый раз, когда функция выполняется_. Это делает вашу функцию медленнее без уважительной причины. – RemcoGerlich

ответ

1

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

Смежные вопросы