Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 2, 2011 13:32:40

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

вложенные with

как проще написать вложенные with - смущают бООльшые отступы

with open_db() as db:
with open_connection() as conn:
with open("a.dat") as file1:
with open("b.dat") as file2:
with getuserlock() as gu
do something
...............
...............
...............
...............
В c++ все понятно
{
dblinker linker;
dbconnector connector;
ifstream f1;f.exceptions(0xffff);f1.open("a.dat");
ifstream f2;f.exceptions(0xffff);f2.open("b.dat");
userlock lock;

do something
...............
...............
...............
...............
}
В учебнике по Жабе явно предлагают вложенные try-finally. :(

Может кто делал more pythonic style?
НУ может как-то так:
with li(open_db(),
open_connection(),
open("a.dat"),
open("b.dat"),
getuserlock()) as db,file1,file2,gu:
do something
...............
...............
...............
...............



Офлайн

#2 Авг. 2, 2011 13:47:38

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

вложенные with

Если не можете использовать Python3 — делайте через contextlib.nested



Офлайн

#3 Авг. 2, 2011 13:52:00

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

вложенные with

>>> A = type('A',(object,),{})
>>> with A() as a, A() as b:
... pass
Для 2,7

Офлайн

#4 Авг. 2, 2011 14:07:57

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

вложенные with

спасибо



Офлайн

#5 Авг. 3, 2011 06:39:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

вложенные with

это, по ходу, баг

по идее, должно это работать:

with open_db() as db, \
open_connection() as conn, \
open("a.dat") as file1, \
open("b.dat") as file2, \
getuserlock() as gu:
do something
на bugs.python.org надо спросить

add
а, не, работает, это я забыл кавычки проверить все
with open('/etc/passwd') as f1, \
open('/etc/profile') as f2, \
open('/etc/bashrc') as f3:
for a, b, c in zip(f1, f2, f3):
print(a, b, c)



Отредактировано (Авг. 3, 2011 08:10:45)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version