Size: a a a

2021 January 25

RB

Roman Bolkhovitin in rannts
ildar nizamov
я бы упирал на "делай как в остальном проекте и не выпендривайся"
Это очень апасна однако. Я видел проект на твистеде, в который засунули синхронный драйвер бд, но перед каждым вызовом старательно написали yield. Спросил - это что, карго-культ, говорят да 🙈
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Elena K
ну контекст ровно попробовать взять последний необязательный ключ в словаре
Не видно что внитри обработчика исключения. Если там присвоение дефолтого значения -  то лучше .get(). Если там что-то совсем другое и никаким дефолтным значением не пахнет, то try...except - нормально. Хоть и есть тонкости в случае если надо отличать ситуацию "нет ключа devices" или "нет ключа cd". А ещё devices может быть не словарь 😊.
источник

RB

Roman Bolkhovitin in rannts
О! А вы часто веткой else пользуетесь в try/except и циклах?
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Roman Bolkhovitin
О! А вы часто веткой else пользуетесь в try/except и циклах?
Бывает иногда, но не часто.
источник

KK

Kirill (Cykooz) Kuzm... in rannts
else в try...except бывает полезен, когда надо выполнить какой-то код (в случае когда нет ошибок в try...except), но так что бы этот самый try...except не ловил ошибки от этого кода.
источник

AZ

Alexander Zelenyak in rannts
Roman Bolkhovitin
О! А вы часто веткой else пользуетесь в try/except и циклах?
Не редко. Очень удобные конструкции, на самом деле.
источник

RB

Roman Bolkhovitin in rannts
Kirill (Cykooz) Kuzminykh
else в try...except бывает полезен, когда надо выполнить какой-то код (в случае когда нет ошибок в try...except), но так что бы этот самый try...except не ловил ошибки от этого кода.
Логично, я вообще больше одной строчки в блоке  try не люблю
источник

SB

Sergey Belash in rannts
Наш путь — замалчивать о проблемах:
from contextlib import suppress
with suppress(KeyError):
   disks = params["devices"]["cd"]
источник

A🌚

Al 🌚l in rannts
Sergey Belash
Наш путь — замалчивать о проблемах:
from contextlib import suppress
with suppress(KeyError):
   disks = params["devices"]["cd"]
Лол, кек, disks = params.get("devices", {}).get("cd")
источник

SB

Sergey Belash in rannts
Ну так у вас в disks будет богомерзкий None
источник

EK

Elena K in rannts
ну вот и у меня по ощущениям, всегда через get писали (или прочее синт сахара setdefault, key in ... )  Мне лично глаз режет получение необязательного ключа через try-except
источник

EK

Elena K in rannts
Sergey Belash
Ну так у вас в disks будет богомерзкий None
а чем плох None?
там в общем код
try
   disks = params["devices"]["cd"]
except KeyError:
   log()
   return

 
по мне красивее:
disks = params["devices"].get("cd", [])
if not disks:
   log("нечего делать")
   return
<работа с disk>
источник

SB

Sergey Belash in rannts
Elena K
а чем плох None?
там в общем код
try
   disks = params["devices"]["cd"]
except KeyError:
   log()
   return

 
по мне красивее:
disks = params["devices"].get("cd", [])
if not disks:
   log("нечего делать")
   return
<работа с disk>
Ничем, ничем. Шутка. Говоря о вашем варианте, первый все же лучше. Python это EAFP язык https://docs.python.org/3/glossary.html#EAFP
источник

SB

Sergey Belash in rannts
То есть try/except предпочтительней if/else
источник

SB

Sergey Belash in rannts
Kirill (Cykooz) Kuzminykh
Не видно что внитри обработчика исключения. Если там присвоение дефолтого значения -  то лучше .get(). Если там что-то совсем другое и никаким дефолтным значением не пахнет, то try...except - нормально. Хоть и есть тонкости в случае если надо отличать ситуацию "нет ключа devices" или "нет ключа cd". А ещё devices может быть не словарь 😊.
Вот Кирилл правильно заметил. Если вам просто значение получить, то .get. Если есть какая-то логика, в вашем случае лог, то try/except вполне себе
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Elena K
а чем плох None?
там в общем код
try
   disks = params["devices"]["cd"]
except KeyError:
   log()
   return

 
по мне красивее:
disks = params["devices"].get("cd", [])
if not disks:
   log("нечего делать")
   return
<работа с disk>
Если ошибка случается сильно редко, то try...except работает быстрее чем if. И у тебя как раз случай, когда не требуется дефолтное значение, а надо сделать что-то совсем другое (залогировать ошибку и завершить выполнение функции)
источник

SB

Sergey Belash in rannts
Elena K
а чем плох None?
там в общем код
try
   disks = params["devices"]["cd"]
except KeyError:
   log()
   return

 
по мне красивее:
disks = params["devices"].get("cd", [])
if not disks:
   log("нечего делать")
   return
<работа с disk>
Опять же, первый вариант защитит от случая если ключа “devices” нет, во втором примере программа упадет. То есть кода не меньше, читабельность не лучше, надежность меньше.
источник

AS

Artem Savinov in rannts
Kirill (Cykooz) Kuzminykh
Если ошибка случается сильно редко, то try...except работает быстрее чем if. И у тебя как раз случай, когда не требуется дефолтное значение, а надо сделать что-то совсем другое (залогировать ошибку и завершить выполнение функции)
то есть в целом через get и дальнейший ифчик будет работать быстрее?
*чисто для себя
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Artem Savinov
то есть в целом через get и дальнейший ифчик будет работать быстрее?
*чисто для себя
Нет, if на каждый вызов - это медленней, чем except только в 1% случаев.
источник

EK

Elena K in rannts
ну тут конечно детали начинаются))
просто если мы типо логируем что нам нечего делать, потому что параметр не пришел, то по хорошему надо залогировать когда там в cd пустой список пришел... и + тот же if в коде

а devices в данном случае обязателен. Если он вдруг не пришел, тут мы даже замаскируем проблему...
источник