уменьшить список функций с аргументом ключевого слова в словаре в python - PullRequest
1 голос
/ 21 января 2020

:)

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

У меня есть этот словарь

d = {"me": "gab", "you": "cita"}

и предположим, что глупая функция, как это:

def make_caps(dic, on=None):
    if on is not None:
        to_cap = dic.get(on, None)
    if to_cap is not None:
        dic[on] = to_cap.upper()
    return dic

Я хотел бы, чтобы это работало:

def reduce_fns_on_dict(fns, dic):
    from functools import reduce
    return reduce(lambda d, f: f(d), fns, dic)

new_dic = reduce_fns_on_dict(fns=[make_caps(on="me"), make_caps(on="you")], 
                             dic=d)

print(new_dic)

на консоли

{'me': 'GAB', 'you': 'CITA'}

Но когда я запускаю вышеупомянутое, я получаю:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: make_caps() missing 1 required positional argument: 'dic'

Ответы [ 2 ]

1 голос
/ 21 января 2020

Чтобы завершить ответ от @FiddleStix, я предлагаю вам использовать словарное понимание, которое мне подходит в вашем случае:

d = {"me": "gab", "you": "cita"}
new_dic = {k:v.upper() for k,v in d.items() if k in ["me","you"]} 
print(new_dic)
# {'me': 'GAB', 'you': 'CITA'}

Примечание: вы можете удалить if k in ["me","you"], если Вы хотите использовать все значения словаря.

1 голос
/ 21 января 2020

make_caps(on="me") вызывает функцию make_caps. То, что вы хотите, это новая функция, которая ведет себя как make_caps(some_arg, on='me'). Вы можете сделать такую ​​функцию с помощью functools.partial . Строка будет выглядеть примерно так: fns=[partial(make_caps, on="me")....

РЕДАКТИРОВАТЬ: В качестве альтернативы, вы можете карри функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...