Вам не нужен массив a
b.map(&:values).map.with_index {|(item, quantity), index|
"#{index + 1}. #{item} #{quantity}"
}.join(' ')
=> "1. apple 92 2. banana 43 3. kiwi 55"
Это возможно в Python 3, начиная с v3.1 и Python 2.7 . Новый с
синтаксисом поддерживает несколько менеджеров контекста:
with A() as a, B() as b, C() as c:
doSomething(a,b,c)
В отличие от contextlib.nested
, это гарантирует, что a
и b
] будет вызывать их __ exit __ ()
, даже если метод C ()
или метод __ enter __ ()
вызывает исключение.
Вы также можете использовать более ранние переменные в более поздних определениях (h / t Ahmad ниже):
with A() as a, B(a) as b, C(a, b) as c:
doSomething(a, c)
В Python 3.1 + можно указать несколько выражений контекста, и они будут обработаны, как будто приблизительно with
операторы были вложены:
with A() as a, B() as b:
suite
эквивалентно
with A() as a:
with B() as b:
suite
, Это также означает, что можно использовать псевдоним от первого выражения во втором (полезный при работе с соединениями/курсорами дб):
with get_conn() as conn, conn.cursor() as cursor:
cursor.execute(sql)
Я думаю, вы захотите сделать это вместо этого:
from __future__ import with_statement
with open("out.txt","wt") as file_out:
with open("in.txt") as file_in:
for line in file_in:
file_out.write(line)
contextlib.nested
поддерживает это:
import contextlib
with contextlib.nested(open("out.txt","wt"), open("in.txt")) as (file_out, file_in):
...
Обновление:
Чтобы процитируйте документацию относительно contextlib.nested
:
Не рекомендуется, начиная с версии 2.7 : Оператор with теперь поддерживает это функциональность напрямую (без сбивающих с толку причуд, подверженных ошибкам).
См. ответ Рафала Довгирда для получения дополнительной информации.