Реальные примеры частичной функции - PullRequest
3 голосов
/ 12 января 2012

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

Ответы [ 3 ]

11 голосов
/ 12 января 2012

Я часто использую его для печати на stderr вместо значения по умолчанию stdout.

from __future__ import print_function
import sys
from functools import partial

print_stderr = partial(print, file=sys.stderr)
print_stderr('Help! Little Timmy is stuck down the well!')

Затем вы можете использовать это с любыми другими аргументами, принятыми функцией print:

print_stderr('Egg', 'chips', 'beans', sep=' and ')
6 голосов
/ 12 января 2012

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

Итак, предположим, я хочу создать числовую панельи узнать, какая кнопка была нажата:

import Tkinter
from functools import partial

window = Tkinter.Tk()
contents = Tkinter.Variable(window)
display = Tkinter.Entry(window, textvariable=contents)

display.pack()

def clicked(digit):
    contents.set(contents.get() + str(digit))

counter = 0

for i, number in enumerate("7894561230"):
    if not i % 3:
        frame = Tkinter.Frame(window)
        frame.pack()
    button = Tkinter.Button(frame, text=number, command=partial(clicked, number))
    button.pack(side="left", fill="x")

Tkinter.mainloop()
0 голосов
/ 12 января 2012

Посмотрите на мой вопрос здесь: Имеет ли Python встроенную функцию для чередования генераторов / последовательностей?

from itertools import *
from functional import *

compose_mult = partial(reduce, compose)
leaf = compose_mult((partial(imap, next), cycle, partial(imap, chain), lambda *args: args))

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

...