<Python> functools.partial для функций-членов

yroslavasako

В руководстве питона рекомендуют использовать partial вместо самописных лямбда-выражений. Передо мной стал вопрос о необходимости применения partial к функции func(self,*args,**kw). self является первым атрибутом, но его не нужно и нельзя фиксировать, а хочется фиксировать последующие, пропустив self. Какая конструкция для этого будет наиболее pythonic-way?

bleyman

Ты и не можешь его фиксировать.
Когда ты пишешь obj.method тебе уже возвращается partially applied функция. Причём всегда, даже когда ты пишешь сразу obj.method(blah, blah) — вначале возвращается bound method, потом он применяется к аргументам.
Этим питон отличается от плюсов и сишарпа, где this подставляется нулевым аргументом на call site.
Если же тебе хочется применить произвольную функцию к произвольному объекту как если бы это был его метод, то не знаю, я не уверен, что это вообще возможно, а если и возможно, то только с очень суровой магией.

psihodog

ну пиши лямбду, не парься
2 Fj: это ты к чему, вообще, наговорил-то? :grin:

psihodog

Если же тебе хочется применить произвольную функцию к произвольному объекту как если бы это был его метод, то не знаю, я не уверен, что это вообще возможно, а если и возможно, то только с очень суровой магией.
не вижу никаких препятствий.
да, obj.method — это (грубо говоря) сахар для partial(cls.method, obj но функция cls.method ничем не отличается от десятков миллионов других себе подобных.
Upd.
Да, но, очевидно, человеку нужно не это, а просто сделать из метода с аргументами метод без аргументов.
Типа есть список строк, надо вывести список индексов, где встречается строка 'a':
>>> finda = lambda s: s.find('a')
>>> [finda(s) for s in moi_stroki]

yroslavasako

человеку нужно было сгенерить из одного класса - другой. Соответственно функции ещё не bounded.
Напишу лямбду

Dmitriy82

Если у тебя метод по смыслу не "виртуальный", то можно так.
from functools import partial

class C(object):
def m(self, x):
print 'base',x

class D(C):
def m(self, x):
print 'derived',x

f = partial(C.m, x=42)
f(C # base 42
f(D # base 42
Оставить комментарий
Имя или ник:
Комментарий: