Найти - Пользователи
Полная версия: Сокращение для try... except
Начало » Python для новичков » Сокращение для try... except
1
odnochlen
Есть ли какая-то сокращенная запись для
try:
    code
except Exception:
    pass

Например, чтобы здесь не выскакивало исключение, а, например, элемент просто не включался в список.
[x[5] for x in y]
FishHook
y=[(1,2,3,4,5,6),(1,2,3)]
print filter(None,[x[5] if len(x)>=5 else None for x in y])
odnochlen
А именно чтобы возвращался default или значение фильтровалось в случае эксепта?
PooH
odnochlen
А именно чтобы возвращался default или значение фильтровалось в случае эксепта?
Вот такой вариант, правда не слишком изящный :(
def safe_get(x, n):
    try:
        return x[n]
    except IndexError:
        pass
    
[safe_get(x, 5) for x in y]

или вот так даже, правда мне не нравиться, что ловятся все исключения
def safe_call(callable, obj, default=None):
    try:
        return callable(obj)
    except Exception:
        return default
    
[safe_call(lambda x: x[5], x, False) for x in y]
o7412369815963
Вариант FishHook без filter подходит для этого.
print [x[5] if len(x)>=5 else None for x in y]
или
print map(lambda x:(x[5] if len(x)>5 else None), y)

try except для этого - плохой вариант, т.к. он медленный (относительно).
odnochlen
o7412369815963, а что если так:
[f(x)[5] for x in y]
Как избежать повторного вызова f()? И что если там не индекс, а какой-то json.loads() и просто так предотвратить исключение нельзя?

o7412369815963
try except для этого - плохой вариант, т.к. он медленный (относительно).
А я читал, что
try:
    dic[x]
except KeyError:
    #...
быстрее, чем

if x in dic:
    dic[x]

PooH
или вот так даже, правда мне не нравиться, что ловятся все исключения
-тся/-ться
Так уже ближе. А что с того, что ловится все? Так часто делают, потому что в питоне хрен выяснись, что может бросать код. Так даже в яве делают, где с этим таких проблем нет.
Да, наверно, это то, что надо. Можно сделать с args и kwargs.
o7412369815963
odnochlen
Как избежать повторного вызова f()?
Закешировать результат, и отдавать его привызове.

odnochlen
А я читал, что
Оно быстрее если try-except использовать по назначению, т.е. для исключительных ситуаций, а т.к. мы разговариваем о сферическом коне, то лучший инструмент нельзя подобрать (нужно на конкретных данных)
Вот пример где 50% ключей отсутствуют:
#!/usr/bin/python
from timeit import Timer
dim=[(1,2,3,4,5,6),(1,2,3)] * 100000
default = None
def foo0():
    for y in dim:
        try:
            x = y[5]
        except IndexError:
            x = default
def foo1():
    for y in dim:
        if len(y) > 5: x = y[5]
        else: x = default
print Timer('test()', "from __main__ import foo0 as test").timeit(number=100)
print Timer('test()', "from __main__ import foo1 as test").timeit(number=100)
dim = [{ 5:0 }, {}] * 100000
def bar0():
    for y in dim:
        try:
            x = y[5]
        except KeyError:
            x = default
def bar1():
    for y in dim:
        x = y.get(5, default)
print Timer('test()', "from __main__ import bar0 as test").timeit(number=100)
print Timer('test()', "from __main__ import bar1 as test").timeit(number=100)
с try-except выполняется в 3-4 раза медленней:
9.03296399117
2.14645504951
8.65659809113
2.97780108452

odnochlen
Так уже ближе. А что с того, что ловится все?
Это опять же зависит от задачи, разделение исключений на допустимые и не допустимые.
Например при получении данных от сервера можно игнорировать “кривые данные”, но если сервер не доступен, то сообщить об этом “на верх”.

А вообще raise - это метод передачи управления в другое место “напрямую”. Например можно в сложной рекурсивной ф-ии вернуть результат “на верх”: raise Result(5), вместо кучи return-ов.

odnochlen
o7412369815963
Закешировать результат, и отдавать его привызове.
Не-а, я имею в виду, чтобы не вызывать ее 2 раза за один цикл. Что если там readline()?

Парсер задолбал пустые строчки в коде вырезать. Он из строк их тоже вырезает?

Там вообще-то речь шла о dict и ветвлении, а не о дефолтовом значении. А может даже о том, что для среднестатистически наполненного словаря двойной поиск невыгоднее одиночного с поимкой относительно редкого исключения.

o7412369815963
Это опять же зависит от задачи, разделение исключений на допустимые и не допустимые.
Например при получении данных от сервера можно игнорировать “кривые данные”, но если сервер не доступен, то сообщить об этом “на верх”.
Да, но опять же, это часто игнорируют, а в питоне ожидаемые исключения можно выковырять только из документации или исходников.
Даже в яве мне советовали при парсинге json ловить Exception.

o7412369815963
А вообще raise - это метод передачи управления в другое место “напрямую”. Например можно в сложной рекурсивной ф-ии вернуть результат “на верх”: raise Result(5), вместо кучи return-ов.
Ах да, в питоне же break с меткой нету.
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