Выполнить функцию на результат другой функции, если не нет - PullRequest
0 голосов
/ 03 октября 2019

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

В подробном виде это выглядит так:

result = get_something()
if result:
    answer = transform(result)

в качестве альтернативы я мог бы сделать

if get_something():
    answer = transform(get_something())

, но это требует вызова первогоФункция дважды

есть ли способ сделать все это в одной строке, как троичный (может быть, как лямбда)

answer = transform(result) if get_something() else None

Очевидно, что в приведенном выше нет ничего, чтобы утверждать, чторезультат, но я должен сказать, в основном, где result = get_something()

Я могу сделать это в понимании списка, но это кажется немного глупым

   answer = [transform(x) for x in [get_something()] if x][0]

Ответы [ 3 ]

2 голосов
/ 03 октября 2019

В последней версии Python ( Python 3.8 ) есть новое назначение, которое может быть полезно для вас, :=:

Существует новый синтаксис :=, которыйприсваивает значения переменным как часть большего выражения. Он ласково известен как «оператор моржа» из-за его сходства с глазами и бивнями моржа.

if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")

В этом примере выражение присваивания помогает избежать вызова len ()дважды:

0 голосов
/ 03 октября 2019

Хотя я не до конца понимаю причины, по которым все происходит так (что менее понятно, чем у других ), вот пример использования lambda :

>>> def get_something(flag):  # Added the flag argument, to mimic different return values
...     return 5 if flag else None
...
>>> answer = (lambda func, arg: func(arg) if arg else None)(int, get_something(True))
>>> answer
5
>>> answer = (lambda func, arg: func(arg) if arg else None)(int, get_something(False))
>>> answer
>>>
0 голосов
/ 03 октября 2019

Мы можем в Python 3.8 с выражениями присваивания :

if (result := get_something()) is not None:
    # do something with result
...