Архив автора: admin

Зачем в python with

Долгое время при работе с файлами из python я писал примерно следующий код:

Без подсветки синтаксиса

def some_func(fname):
    fd = open(fname)
    some_data_processing(fd.read())
    return result

 

def some_func(fname):
    fd = open(fname)
    some_data_processing(fd.read())
    return result

 

Тут предполагается, что в любом случае при выходе из функции переменная fd уничтожится и вместе с ней закроется файл и все будут жить долго и счастливо.

Но что будет если в some_data_processing произойдет исключение?

Например так:

Без подсветки синтаксиса

import sys

class TestClass(object):
def __del__(self):
print «I’m deleted»

def data_process():
obj = TestClass()
raise IndexError()

try:
data_process()
except:
print «In exception handler»

print «after except»

 

import sys

class TestClass(object):
def __del__(self):
print «I’m deleted»

def data_process():
obj = TestClass()
raise IndexError()

try:
data_process()
except:
print «In exception handler»

print «after except»

 

На консоли появляется:

    In exception handler
    after except
    I'm deleted

Почему-то «In exception handler» и «after except» выводятся раньше «I’m deleted».

Первая проблема в том, что вместе с исключением питон хранит и трейс стека, содержащий все фреймы вплоть до породившего исключение. А внутри фрейма живет f_locals — словарь локальных переменных, и именно он имеет ссылку на экземпляр класса TestClass. Таким образом до окончания обработки исключения obj будет жить точно. Почему же «after except» появляется раньше чем «I’m deleted»? Было бы логично чистить трейс после успешного выхода из блока try. Дело в том что 2.X питон не всегда чистит внутренние структуры после обработки исключения и в общем случае вы должны явно вызывать функцию sys.exc_clear чтобы очистить их. Когда я подошел с этим вопросом к Larry Hastings (одному из основных разработчиков ядра питона) ему потребовалось около 20ти минут, что-бы понять что происходит и найти в документации sys.exc_clear. (Правда стоит отметить, что он давно использует 3.X, где это поведение стало адекватнее.) В 3.X это поведение улучшили, и теперь sys.exc_clear автоматически вызывается окончанию обработки исключения.

Кстати, если вы напишете примерно такой код:

Без подсветки синтаксиса

try:
    data_process()
except:
    fr = sys.exc_info()[2]
    del fr

 

try:
    data_process()
except:
    fr = sys.exc_info()[2]
    del fr

 

то не забудьте удалить fr используя del, как в последней строке — иначе он образует циклическую ссылку с текущим фреймом и тогда все станет совсем плохо.

Стоит отметить, что подобное поведение проявляется не всегда. Например сл

Снежинки из фетра

Двусторонние снежинки из фетра

Хотя до Нового года еще практически два месяца, праздничные приготовления планировать нужно уже сегодня, иначе вы просто ничего не успеете. Предлагаем обновить елочные украшения и сшить двусторонние снежинки из фетра.

Снежинки из фетра

Читать

Параметры жестких дисков

Жесткий диск – важнейший элемент компьютера. К его выбору необходимо подойти с особой тщательностью, и при необходимости обратиться к специалисту. Ведь жесткие дики тут используются как на серверах, так и на персональных компьютерах

Существует несколько основных параметров, на которые необходимо обращать особое внимание при выборе столь сложного устройства. Современные диски обычно производятся с вращающейся скоростью 5400-7200 оборотов за 1 минуту. Чем выше скорость, тем быстрее совершается обмен данными. Но следует учитывать, что при высокой скорости вращения возрастает температура корпуса, и такие жесткие диски требуют внешнего охлаждения (например, вентилятор собственного диска). Читать

Укрепляем детский иммунитет с первых дней. Что нужно знать?

Больше всего на свете родители желают здоровья своим детям. Однако желания одного недостаточно, к сожалению. Укреплять иммунитет малыша нужно постоянно и запускать этот процесс следует еще в первые недели жизни крохи в утробе матери. Как же это сделать, спросите вы? Для начала маме надобно осознать всю серьезность своей миссии и воспринимать беременность, как подобает, то есть расслабиться, кушать полезные продукты, делать легкую ежедневную разминку, гулять. Все это укрепляет ее организм, а вместе с тем и малышу идет на пользу. Помимо этого ребенку передаются мамины антитела, которые и создают его собственный иммунитет. После рождения нужно приложить малютку к груди – мамино молоко очень насыщено всеми необходимыми иммуноглобулинами, которые защитят кроху от вирусных атак внешнего мира. Очень важную роль играет грудное вскармливание до 6-ти месяцев, если ребенок недоношенный, то до 2-х лет. Именно мамины антитела помогают детскому иммунитету справляться со всеми инфекциями и налаживать свою активную работу. Следующим этапом является прикорм. Родители не всегда уделяют ему должное внимание и поэтому стараются рацион крохи забить всем, чем угодно, лишь бы отдохнуть от грудного вскармливания или же готовки смесей. Однако, если продукты, составляющие ежедневное питание ребенка не будут содержать достаточное количество разнообразных белков, жиров, углеводов, необходимых для его развития витаминов, минералов и других стройматериалов, то пострадает от этого не только вес малыша, но и общее состояние организма, хоть проявиться последствия могут не сразу, поэтому и причину проблемы вы уже не поймете. Очень важно для правильного развития иммунитета закалять ребенка. Это должны быть разнообразные процедуры: воздушные ванны, контрастный душ, массажи и другие способы. Помимо всего вышесказанного педиатр может порекомендовать средства для иммунитета для детей. Важно понимать, что это не лекарства и никакого побочного вреда здоровью они не наносят, как антибиотики, к примеру. Такие препараты направлены на поддержание организма в тонусе и рекомендуются даже взрослым при частой подверженности инфекциям или эпидемиях. Поход в садик является испытанием для родителей – в первые месяцы пребывания в большом и новом коллективе малыши начинают болеть. Воспринимать это можно по-разному, но правильнее всего понять, что легкая простуда является некой закалкой для организма, которая все равно пойдет на пользу развивающемуся иммунитету. Кстати, признаками слабой защитной функции ребенка не всегда являются частые болезни. На некрепкое состояние иммунной системы указывают: • Быстрая утомляемость, сонливость, слабость; • Частые психологические расстройства, апатия; • Аллергии; • Вирусные и простудные заболевания более 5–ти раз в течение года; • Дисбактериоз кишечника; • Увеличенные подмышечные и шейные лимфоузлы; • Отсутствие температуры при болезни. Все это является последствиями неправильного прикорма, скудного или чрезмерно насыщенного вредными продуктами рациона, передозировка лекарственными препаратами, пренебрежение легкой физкультурой и закаливанием. Родители должны знать, что иммунитет можно создавать самостоятельно, как и провоцировать возникновение болезней. Ведите здоровый образ жизни и вовлекайте в это своего малыша.

Декорирование шелкового шарфа

Розы из шерсти на шелковом шарфе – необычно, не правда ли? Такая работа обещает быть особенно интересной хотя бы потому, что ранее мы ничего подобного не делали. К тому же новый и весьма интересный аксессуар сегодня не помешает в гардеробе современной женщины.

Украшение шарфа

Читать