Как присвоить результат выполнения двух функций python в одну переменную и одну строку

У меня есть две функции:

def replacer(text):
    return text.replace('*', '')

def replacer_(text):
    return text.replace('!', '')

И текст который должен передаваться каждой из функций выше:

text = '*ello worl**!'

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

text = 'ello worl'

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

# первый плохой пример
result1 = replacer(text)
result = replacer_(result1)

# второй плохой пример
result1 = replacer(text); result = replacer_(result1)

Почему эти примеры являются для меня плохими и почему они нежелательны с моей стороны:

  1. Мои названия функций гораздо больше, чем приведены на примерах
  2. Название моей переменной с текстом гораздо больше, чем приведена на примере
  3. Код который был приведен выше, был добавлен в качестве примеров, чтобы решить мою другую текущую проблему, которая с этим связана (поэтому здесь всё на примерах)
  4. Из-за подозрения что это можно сделать более лучше, чем делать идентичные действия одного к другому

Также не хотелось бы видеть (из-за причин указанных выше):

result = replacer(replacer_(text))

Ответы (5 шт):

Автор решения: MaxU

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

# словарь замен: ключ - что меняем, значение - на что заменяем
mapping = {
  "hi": "привет",
  "all": "всем",
  "how are you doing": "как дела"
}


def repl(s, map_):
    res = s
    # делаем в цикле все замены согласно словарю замен
    for k, v in map_.items():
        res = res.replace(k, v)
    return res

Пример использования:

In [301]: repl("hi all! how are you doing?", mapping)
Out[301]: 'привет всем! как дела?'
→ Ссылка
Автор решения: CrazyElf

Можно сделать ещё вот так: просто записать все нужные функции в список и по очереди их применить. Хотя вариант MaxU с маппингом лучше/правильнее.

def replacer(text):
    return text.replace('*', '')

def replacer_(text):
    return text.replace('!', '')

text = '*ello worl**!'
replacers = [
    replacer, 
    replacer_
    ]
for r in replacers:
    text = r(text)
print(text)

Вывод:

ello worl
→ Ссылка
Автор решения: GrAnd

По мотивам ответа @MaxU, но в один проход используя regexp.

import re

mapping = {
  "hi": "привет",
  "all": "всем",
  "how are you doing": "как дела"
}

def repl(s, map_):
    return re.sub("|".join(re.escape(k) for k in map_), lambda m: map_[m.group(0)], s)

print(repl("hi all! how are you doing?", mapping))
→ Ссылка
Автор решения: Михаил Муругов
# Необходимый импорт
from functools import reduce

# Первая Ваша функция
def replacer(text):
    return text.replace('*', '')

# Вторая Ваша функция
def replacer_(text):
    return text.replace('!', '')


if __name__ == '__main__':
    # Исходный текст
    text = '*ello worl**!'

    # Применение всех функций к исходному тексту в одну строку
    result = reduce(lambda acc, func: func(acc), (replacer, replacer_), text)

    # Вывод результата
    print(result)
result = reduce(lambda acc, func: func(acc), (replacer, replacer_), text)
#        ^ Свёртка
#               ^ Правило свёртки
#                                            ^ Множество объектов для свёртки
#                                                                   ^ Начальное значение

functools.reduce.

→ Ссылка
Автор решения: extrn

Во внешней библиотеке toolz есть несколько подходящих функций, в частности

compose(f, g, h, ...)(x) = f(g(h(...(x))))
compose_left(f, g, h, ...)(x) = ...(h(g(f(x))))
pipe(x, f, g, h, ...) = ...(h(g(f(x))))

from toolz import pipe

result = pipe('*ello worl**!', replacer, replacer_)

Более содержательный пример

from toolz import compose_left

replacers = replacer, replacer_
replace_all = compose_left(*replacers)
result = replace_all('*ello worl**!')
→ Ссылка