Каков вариант использования шаблона вложенной функции в Python? - PullRequest
1 голос
/ 07 мая 2020

Хотя существует много дискуссий по поводу создания и использования вложенных функций, очень мало информации о , когда их использовать. Я пытаюсь выяснить следующее: когда идиоматически c использовать вложенную функцию? Когда следует использовать lambda x: <function> над вложенной функцией?

Python - это язык, который позволяет делать много вещей, которые не должны (ie: использовать глобальные переменные). Это функция, которую вы можете использовать, но не должны?

Сценарий, который я предполагал использовать, находится в модульном тестировании. Допустим, у вас есть метод, определенный следующим образом:

def FunctionOne(varone: int, vartwo: object) -> None:
  assert varone == vartwo() 

vartwo - это функция, которая передается в функцию. Теперь мы хотим протестировать это. Итак, мы пишем (частичный) модульный тест, который выглядит следующим образом:

def unittest() -> None:
  def test_function() -> int:
    return 1
  FuncitonOne(1, test_function)

Здесь есть следующие особенности:

  1. Функция нужна только в рамках функции модульного теста. .
  2. Функция никогда не вызывается где-либо еще.

Таким образом, резюмируя: когда (если вообще) использовать вложенную функцию с Python?

1 Ответ

3 голосов
/ 07 мая 2020

Прежде всего, обратите внимание, что вложенная функция предлагает функции, которых нет в lambda или глобальной функции.

  • Это может быть несколько операторов, в отличие от lambda
  • Он может иметь закрытие в противовес глобальной функции

Таким образом, чисто функционально-ориентированным ответом было бы использование вложенной функции всякий раз, когда вам нужно определить мульти- операторы функции с закрытием.

Вот пример такой функции.

def create_counter(step):
    start = 0
    def count():
        print(start)
        start += step
    return count

Обратите внимание, что еще одним повторяющимся примером этого варианта использования являются декораторы.

def decorator(f):
    def wrapper(*args):
        ...
        f(*args)
        ...
    return wrapper

@decorator
def my_function(*args):
    ...

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

...