2014-05-07 3 views
1

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

names = ['Alice', 'Bob', 'Charlie'] 

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

map(lambda name: foo('carol', str.lower(name)), names) 

Есть ли способ изменить foo, чтобы принять вызываемый bar, который оценивается непосредственно перед оценкой foo? Поэтому я могу написать примерно так:

map(partial(foo, 'carol', str.lower), names) # foo sees the name in lowercase 
+3

Вы пробовали 'name_I_want на карте (str.lower, names)'? Возможно, я что-то пропустил. – Daenyth

+0

Я не уверен, что ваш пост в замешательстве, или я просто глуп ... – KurzedMetal

+0

Возможно, мой пост в замешательстве. На самом деле я понятия не имею, о чем я прошу. :) – hso

ответ

3

Это то, что они сделали декораторами! Посмотрите на декоратора, что более низкие случаи все аргументы пройти к некоторой функции:

def lower_args(func): 
    @functools.wraps(func) 
    def _wrapper(*args, **kwargs): 
    l_args = map(str.lower, args) 
    l_kwargs = {(name, str.lower(value)) for (name, value) in kwargs} 

    return func(*l_args, **l_kwargs) 
    return _wrapper 

Используется так:

@lower_args 
def foo(a, b, c): 
    #and your code goes here 

Чтобы сделать то, что вы хотите, изменить синтаксис немного

def to_lower(mod_func): 
    def deco(func): 
    @functools.wraps(func) 
    def _wrapper(*args, **kwargs): 
     return func(*map(mod_func, args), {(k, mod_func(v)) for (k,v) in kwargs}) 
    return _wrapper 
    return deco 

Используется как:

@to_lower(my_function) 
def foo(a, b, c): 
    #your code goes here 
2

Питонический способ сделать это - просто использовать выражение генератора. Где вы используете names, вместо того, чтобы ставить:

(name.lower() for name in names) 

Это будет оцениваться как контейнер итерации («ленивый»), как вы хотели.

+1

Это питонический способ достижения композиции отображаемых функций. – Marcin

Смежные вопросы