Обратный вызов Python с передачей аргумента по умолчанию - PullRequest
0 голосов
/ 21 октября 2019

Последние полчаса я читал о различных способах создания обратных вызовов в Python, и я не смог успешно передать параметр по умолчанию, который будет включен, когда он «возвращается».

Код нижедемонстрирует, что я хотел бы, чтобы целое число 5 было включено при выполнении обратного вызова через выход из графического интерфейса Tkinter.

class Heatmap(Updater):
""" Displays the Heatmap provided the data streaming in. """
def __init__(self, data_queue, slider_callback, closed_callback):
    """
    Initialization function for the Osc heatmap.
    :param data_queue: Data streamed in from the buffer for visualization.
    :type data_queue: Queue
    :param closed_callback: When the figure is closed, callback should be used to remove the figure.
    :type closed_callback: Function
    :param slider_callback: Callback function to return the state of the slider to parent caller.
    :type slider_callback: Function
    """
    super(Heatmap, self).__init__()

    self.data_queue = data_queue
    self.closed_callback = closed_callback
    self.slider_callback = slider_callback

    self.window = Tk()
    #self.window.protocol('WM_DELETE_WINDOW', closed_callback)
    atexit.register(self.closed_callback)
...
if __name__ == '__main__':
q = Queue()
for i in xrange(100):
    q.put(i)
def close_cb(idx):
    print 'idx {} window has been closed'.format(idx)
def slider_cb(val):
    print 'slidy {}'.format(val)
closely = lambda x: close_cb(5)
hm = Heatmap(q, slider_cb, closely)
hm.run()

ERROR
TypeError: <lambda>() takes exactly 1 argument (0 given)

Я вижу, что ошибка указывает на мой atexit.register (self.closed_callback), так какожидать, что какой-то аргумент будет передан? Как бы я мог удовлетворить это, не передавая информацию об ошибках, при этом поддерживая тот факт, что я получаю 5 при успешном обратном вызове на выход.

Я также играл с functools.partial.

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

A lambda выражение не требует никаких формальных параметров.

hm = Heatmap(q, slider_cb, lambda: close_cb(5))
0 голосов
/ 21 октября 2019

Вы упомянули в своем вопросе, что пытались partial, но не показали нам, как вы пытались это сделать. Вот пример того, как partial может использоваться в вашем случае:

from functools import partial
hm = Heatmap(q, slider_cb, partial(close_cb, 5))
...