Если функция A требуется только функцией B, следует ли определять A внутри B? - PullRequest
134 голосов
/ 28 января 2011

Простой пример.Два метода, один из которых вызывается из другого:

def method_a(arg):
    some_data = method_b(arg)

def method_b(arg):
    return some_data

В Python мы можем объявить def внутри другого def.Итак, если method_b требуется и вызывается только с method_a, я должен объявить method_b внутри method_a?как это:

def method_a(arg):

    def method_b(arg):
        return some_data

    some_data = method_b

Или я должен избегать этого?

Ответы [ 12 ]

1 голос
/ 28 января 2011

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

...
some_data = method_b() # not some_data = method_b

в противном случае some_data будет функцией.

Наличие этого на уровне модуля позволит другим функциям использовать method_b (), и есливы используете что-то вроде Sphinx (и autodoc) для документации, это также позволит вам документировать method_b.

Вы также можете рассмотреть возможность размещения функциональности в двух методах вкласс, если вы делаете что-то, что может быть представлено объектом.Это хорошо содержит логику, если это все, что вы ищете.

0 голосов
/ 20 июня 2018

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

A) Использование функций без глобалов

def calculate_salary(employee, list_with_all_employees):
    x = _calculate_tax(list_with_all_employees)

    # some other calculations done to x
    pass

    y = # something 

    return y

def _calculate_tax(list_with_all_employees):
    return 1.23456 # return something

B) Использование функций с глобалами

_list_with_all_employees = None

def calculate_salary(employee, list_with_all_employees):

    global _list_with_all_employees
    _list_with_all_employees = list_with_all_employees

    x = _calculate_tax()

    # some other calculations done to x
    pass

    y = # something

    return y

def _calculate_tax():
    return 1.23456 # return something based on the _list_with_all_employees var

C) Использование функций внутридругая функция

def calculate_salary(employee, list_with_all_employees):

    def _calculate_tax():
        return 1.23456 # return something based on the list_with_a--Lemployees var

    x = _calculate_tax()

    # some other calculations done to x
    pass
    y = # something 

    return y

Решение C) позволяет использовать переменные в области действия внешней функции без необходимости объявлять их во внутренней функции.Может быть полезно в некоторых ситуациях.

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