Назначить передачу функции в Python - PullRequest
8 голосов
/ 28 февраля 2011

У меня есть фрагмент кода, который определяет функцию, которая принимает функцию в качестве аргумента, например:

def stuff(n, f):
  f(n)

Теперь я хочу указать значение по умолчанию для f, которое ничего не делает. Итак, я решил использовать pass, вот так:

def stuff(n, f = None):
  if(f is None):
    f = pass
  f(n)

Но это не компилируется. Как мне это сделать?

Ответы [ 6 ]

19 голосов
/ 28 февраля 2011

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

f = lambda x: None
9 голосов
/ 28 февраля 2011

Почему бы не просто это?

def stuff(n, f=None):
    if f is None:
        return
    return f(n)
5 голосов
/ 28 февраля 2011

немного короче:

def stuff(n, f=None):
  f = f or (lambda x: None)
  f(n)

Или даже лучше:

def stuff(n, f=None):
    f(n) if f is not None else None
4 голосов
/ 28 февраля 2011

Нельзя пустить в задницу.Но вы можете создать внутреннюю функцию, которую будете назначать f.

def stuff(n, f=None):
  def empty(n):
    pass
  if f is None:
    f = empty
  f(n)
3 голосов
/ 22 сентября 2014

Общая функция noop:

f = lambda *x,**y:None

Вы можете позвонить

f()
f(0,foo=0)
1 голос
/ 02 июня 2016

Я бы пошел с

def nop(*args, **kwargs):
    pass

def algo(func=nop):
    do_something()
    func()
    do_something_else()

algo() # nop is called
algo(some_callback) # some_callback is called

ИМХО выглядит чище, чем

if foo:
    foo()
...