Найти - Пользователи
Полная версия: PYthon WTF!
Начало » Флейм » PYthon WTF!
1 2 3
mwizard
igor.kaist
try:
from repr import repr as rp
except:
rp=repr
....
# а дальше такое выражение есть
try:
t=chr(i)
except:
t='\x%02i'%(i)
Позвольте уточнить, а почему не использовать более изящную и понятную конструкцию?

try:
from repr import repr
except ImportError:
pass
Также хотелось бы обратить ваше внимание на то, что строка '\x%02i' % i
является некорректной по сути по ряду причин:
1. синтаксис \x## требует два знака, образующих шестнадцатеричное число, у вас же используется %02i, который возвращает десятичное представление. Искренне надеюсь, что это была лишь опечатка и вы имели в виду %02x;
2. вторая причина, по которой это не может работать — пайтон анализирует escape-последовательности на стадии компиляции. В данном случае, он получит на вход бессмысленное выражение \x%0, о чем и сообщит ошибкой ValueError: invalid \x escape;

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

Вот моя реализация chr в случае, если он какого-то дьявола работает иногда некорректно:
def chr(i):
import __builtin__
try:
return __builtin__.chr(i)
except Exception:
return hex(i)[2:].decode('hex')
Надеюсь, мой тон не показался некорректным и/или неуважительным =)
cleg
кстати, в догонку к except:
в таком виде, помимо KeyboardInterrupt так же ловится SystemExit, что в общем-то тоже затруднит использование программы :)
(это описано в РЕР-352)
mwizard
bw
session.begin()
try:
1/0
except:
session.rollback()
log.err()
else:
session.commit()
session.close()
Это исключительная ситуация, я специально ничего не ловлю. <cut>
Сомнений нет, это действительно исключительная ситуация. Но насчет «ничего не ловлю» — тут я с вами не согласен. Но при пустом except-е ловится BaseException, что не является признаком хорошего тона, и в PEP 352 описываются все последствия столь неосмотрительного применения except без параметров.
mwizard
cleg
кстати, в догонку к except:
в таком виде, помимо KeyboardInterrupt так же ловится SystemExit, что в общем-то тоже затруднит использование программы :)
(это описано в РЕР-352)
Иллюстрация в догонку:

>>> import sys
>>> import os
>>> try:
... sys.exit()
... except:
... print 'oh shi!'
...
oh shi!
>>> try:
... os._exit()
... except:
... print 'oh shi!'
...
oh shi!
Единственно возможный выход, который мне видится в таком случае — через ctypes + KillProcess, натравленный на свой PID. Глупо, правда?
bw
> если все таки написать какую подлянку вы ждете
В дейстивтельности я не жду никаких подлянок, в этом вся суть исключений :-). Это не возврат метода.

> и в PEP 352 описываются все последствия столь неосмотрительного применения except без параметров
К сожалению очень плохой плохой английский не позволяет мне ознакомиться с этим трудом. Машинный перевод дело, в понимании текска, скорее усугобляет, нежели помогает. Вообщем, не уловил я там смысла, почему же так нехорошо использовать “пустой except”.

Что до KeyboardInterrupt и т.п., то мне все равно какое исключение и по какой причине происходит, я должен завершить транзакцию, либо прибить недописанный файл или еще чего сделать. Программа должна нормально выполнить некоторый свой цикл (имеющий начало и обязательный конец) несмотря на придурка жмущего Ctrl+C. Согласен, что стоит несколько раз подумать, прежде чем использовать except без аргументов, да и вообще стоит ли отлавливать исключение.

> так же ловится SystemExit, что в общем-то тоже затруднит использование программы :)
Озвучу, уверен, общую мысль. Затруднит использование программы написанной лишь определенной категорией программистов.

p.s. Ну и еще дополню. Обычно между try и except у меня лежат не 2-3 строчки кода, а несколько сотен или тысяч. Ошибки могут происходить самые разные. Я, впринципе, и не жду каких то конкретных исключений (конкретных типов), а отреагировать нужно на любое.

p.p.s. Врядли я буду вызывать sys.exit() в try..except, хотя кто знает :-). Вообще этим методом не пользовался. В основном на Python я пишу сервисы под управлением Twisted, а обработку исключений выполняю через его механизм Deferred. Слава богу, большую часть времени сервисы работают без человеческого внимания.

..bw
cleg
bw
уже написали не один раз. чтоб не ловить KeyboardInterrupt и SystemExit
потому что прогрмма, не убивающаяся через Ctrl-C и игнорирующая sys.exit() - это плохо

даже если у тебя там будет миллион строк кода (кстати, про то что плохо иметь более 50 строк кода в методе - говорить надо?) то except Exception - у тебя как раз словит абсолюно все, кроме этих двух системных исключений, что и требуется в принципе.

и то что ты не будешь вызывать sys.exit() - это не значит этого не будет делать никто из модулей. и не значит что программе не надо отвечать на системные запросы на завершение корректно.

ЗЫ реагировать одинаково на любое эксепшн в сетевом приложении - верный путь к дырам в безопасности…
bw
Ты не понимаешь о чем я говорю. Вероятно потому что я плохо доношу свою мысль или потому что не хочешь видеть ничего кроме нескольких PEP'ов неизвестных мне людей.

p.s. Я продолжу руководствоваться здравым смыслом, а не документацией и фантазиями их авторов.

..bw
cleg
это ты не понимаешь что мы тут вдвоем пытаемся сказать.
независимо от того что ты пишешь, если ты хочешь быть хорошим программистом (или выглядеть так), то надо все-таки делать то тчо рекомендуют авторы языка. они же это не от вредности рекомендуют. тем более что предложенный тебе правильный вариант будет работать так же как у тебя, но ПРАВИЛЬНЕЕ :)

естественно, ты можешь продолжать писать так как тебе хочется, а не так как надо. я эту тему завел чтобы показывать КАК НЕ НАДО писать на питоне. заметь, не НЕЛЬЗЯ а НЕ НАДО!

в общем, тебе спасибо за пример, надеюсь другие люди все-таки больше доверяют “незнакомым людям” :)
slivlen
mwizard
Единственно возможный выход, который мне видится в таком случае — через ctypes + KillProcess, натравленный на свой PID. Глупо, правда?
А можно еще и так:
os.kill(os.getpid(), 9)
=)
cleg
slivlen
о! отлично. теперь тока так и буду делать :) это же красота…
:)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB