Деструктуризация массива в Python - PullRequest
0 голосов
/ 01 мая 2019

Я надеюсь сделать vals в последней строке более понятным.

import rx
from rx import operators as op

light_stream = rx.range(1, 10).pipe(
            op.with_latest_from(irradiance_stream),
            op.map(lambda vals: print(vals[0], vals[1])))  # light, irradiance

Есть ли что-то вроде деструктуризации массива, подобное этому

op.map(lambda [light, irradiance]: print(light_intensity, irradiance))) # fake

или другие способы сделатькод понятен?Спасибо

1 Ответ

2 голосов
/ 01 мая 2019

Python используется для разрешения распаковки итерируемых аргументов в сигнатурах функций, что, по-видимому, является тем, что вам нужно для вашей lambda функции. Эта функция была удалена в Python 3 по причинам, изложенным в PEP 3113 .

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

# def foo(a, (b, c), d):  # this used to be a legal function definition
def foo(a, bc, d):        # but now you must leave the two-valued argument packed up
    b, c = bc             # and explicitly unpack it yourself instead
    ...

Что-то еще, что может делать то, что вы хотите, - это распаковка значений, когда вы вызываете функцию. В вашем примере вы можете вызвать print(*vals), а * говорит Python распаковать итерируемый vals в качестве отдельных аргументов print. Если vals всегда имеет ровно два значения, оно будет точно таким же, как ваш текущий код.

...