LINUX.ORG.RU
ФорумTalks

Плохой Питон

 ,


0

5

по мотивам предыдущего треда.

Вот имеется функция.

def foo(bla):
   if bla > 10 and bla < 20:
        raise ValueError('Некорректно bla: какая-то херь!')

По данному коду:

  1. мы железно знаем что ошибку допустил код вызывающий нас
  2. поэтому правильно бросать исключение указывающее на строку нас вызывающую, а не на нас
  3. как бросить такое исключение?

хочу как в человеческом языке оператор

croak

PS: так же крайне удручает отсутствие полноценных лямбда-функций в этом говноязыке. Блин, как вы живёте без лямбд-то? только не надо мне тыкать в лямбда-оператор, я функцию хочу!

★★

Ответ на: комментарий от deep-purple

Если исключение бросает «наш» код, то ловить это исключение должен вышестоящий, вызывающий.

А завернуть вызов в try...except в вызывающем коде, значит, религия не позволяет.

В перле, на который самоудовлетворяется топикстартер, нормальных стектрейсов вообще нет и не может быть никогда, потому что перл — говно и должен сдохнуть в адских корчах.

shimon ★★★★★
()
Ответ на: комментарий от shimon

завернуть вызов в try

Вообще это зависит от архитектуры. Возможно к месту будет rethrow, возможно вообще всё в один единственный try ... catch, возможно хват нескольких конкретных, возможно только локальный перехват одного типа, возможно его наследников, ну и комбинации вышеперечисленного.

перл — говно

Не ел, не буду ничего утверждать, но ел много пхп. В принципе, любое говно — говно тогда, когда ты в него не можешь/не хочешь.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

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

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Если так, то — да, ты дело говоришь. А почему я понял иначе? Может он пьян? Может я? Может ты? А, не важно... надеюсь, после прочтения нашей ветки у него прояснится.

deep-purple ★★★★★
()

Смажь мазью подгорающее седалище и не бери больше питон в кривые руки. Ну или можешь почитать документацию.

Virtuos86 ★★★★★
()
Ответ на: комментарий от rsync

Вас всем этими дурацкими эксепшнами мёдом намазано? Хочешь чёткое сообщение об ошибке без трейса - кидай обычный принт.

Bfgeshka ★★★★★
()

А доки читать?

Там же прямо пример нарисован, нужно только аргумент добыть/починить:

    raise OtherException(...).with_traceback(tb)

btw, неправильный аргумент вероятно вычисляется не в той строке, где передаётся, т.ч. всё равно по коду бегать.

DonkeyHot ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Единственное ограничение — одно вычисляемое выражение

Нужно просто скобки расставить:

lambda _: (
 1,
 2,
 3,
 4,
)[-1]
DonkeyHot ★★★★★
()

Питон конечно так себе, но претензии у тебя неадекватные совершенно.

ya-betmen ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Вопрос как раз в том, что «потому что гладиолус» - ты не знаешь. Её знает вышестоящий уровень.

В таких случаях просто ловится общая ошибка в вышестоящем уровне, конкретизируется, и перебрасывается как «гладиолус».

Почему так? Потому что иногда, общая ошибка не обязана приводить к другому исключению, а, например, вызывать retry или спрашивать пользователя или другая бизнес-логика, короче.

Deleted
()

Зачем ты пишешь на пистоне? Ты любишь страдать? Найди работу с чем-нибудь интересным, пистон оставь ученым и школьникам.

bread
()

Блин, как вы живёте без лямбд-то?

Выдумывают comprehensions и т.п. новый синтаксис на каждый чих.

no-such-file ★★★★★
()

мы железно знаем что ошибку допустил код вызывающий нас

Тут ты не прав. Если ты «железно знаешь» что такие bla некорректны, то их и не нужно создавать вообще. Т.е. проверять и бросать исключение сразу (в «вызывающем коде»). А если только для твой функции bla некорректен, то чего ты хочешь от библиотеки? И кстати, а какой магией можно выяснить, где именно создан некорректный для тебя (по произвольному критерию) bla?

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

По-моему ты просто плохо понимаешь что вообще такое исключения, и зачем они нужны. Это, в принципе, ожидаемо, если программировать ты учился по «человеческим» языкам типа перла.

morse ★★★★★
()

Надо просто создать тип чисел, способных принимать значения только между 10 и 20 и определить функцию, принимающую этот тип как аргумент, тогда такой ошибки гарантировано не будет. Ах да, это же питон, о чём это я вдруг.

Artificial_Thought ★★★★
()
Ответ на: комментарий от slovazap

Ты никогда не отлаживал код, не искал ошибки по трейсам

при наличии croak трейс нужен в крайне редких случаях. при отсутствии инструмента, конечно ёжики должны будут колоться и хвалить кактус под названием Python

rsync ★★
() автор топика
Ответ на: комментарий от bbk123

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

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

rsync ★★
() автор топика
Ответ на: комментарий от hc

все чего нету - объявляем ненужным. такая парадигма этой секты

rsync ★★
() автор топика
Ответ на: комментарий от pawnhearts

это не цикл, и не if, это генератор и тринарный оператор.

rsync ★★
() автор топика
Ответ на: комментарий от rsync

в python невозможно объявить анонимную функцию: соответственно лямбд нету

в python можно объявить анонимную функцию: соответственно лямбды есть

vvn_black ★★★★★
()
Ответ на: комментарий от WitcherGeralt

так, мою функцию foo вызвали с заведомо неправильным параметром

def div(a, b):
    if not b:
        raise ValueError('На ноль не делим')
    return a / b

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

а в идеальном случае сводиться только к ошибке

я не знаю как это объяснить хорошо. Это культура. дикарям понятие «культура» объяснить сложно.

это дикость - копание в кучах говна в виде стектрейсов

rsync ★★
() автор топика
Ответ на: комментарий от vvn_black

Кмк, что хочет ТС только для отладки и нужно

нет.

традиционная парадигма - бросать исключения только на ошибки кода (либо ошибки внешних обстоятельств, что реже)

соответственно когда в проде выявляется ошибка кода невыявленная тестами, хочется чтобы эта ошибка сразу прямо указывала на место ошибки, а не копаться в тоннах стектрейсов

rsync ★★
() автор топика
Ответ на: комментарий от t184256

А че так негибко, давай сразу оператор blame.

очень хороший вариант и мы его вполне применяли, кстати :)

rsync ★★
() автор топика
Ответ на: комментарий от shimon

В перле, на который самоудовлетворяется топикстартер, нормальных стектрейсов вообще нет и не может быть никогда, потому что перл — говно и должен сдохнуть в адских корчах.

1. В перле есть стектрейсы. 2. В факапных отчетах вполне применяются 3. При наличии более удобных инструментов стектрейсы не нужны, поскольку сообщение об ошибке обычно прямо указывает на место ошибки (а если это не так, то, как правило, этот код написан тупым идиотом, который каким-то образом пролез из мира Java/Python в культурный Perl).

rsync ★★
() автор топика
Ответ на: комментарий от rsync

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

WitcherGeralt ★★
()
Ответ на: комментарий от rsync

обработка ексепшенов в рантайме == зло

Ну, в принципе, на этом месте дискуссию можно прикрывать. Дальнейший разговор бессмысленен и бесполезен, ТС — явный идиот.

morse ★★★★★
()
Ответ на: комментарий от WitcherGeralt

что такое проверки
что такое контрол флоу
зачем нужны трейсы

накидал терминов которых не понимаешь

напомнил анекдот

Я знаю айкидо, тайквандо, карате, самбо... и много других страшных слов!

rsync ★★
() автор топика
Ответ на: комментарий от morse

если код бросает исключение в штатной ситуации, то код неверно сдизайнен.

попробуйте передизайнить - удивитесь, что код станет более читабельным, понятным, а так же доступным к автоматическому тестированию.

впрочем понятие «тестирование» это тоже культура, дикарям из Python недоступна.

pytest и unittest - это блин крокодильи слёзы какие-то, а не инструмент

rsync ★★
() автор топика
Ответ на: комментарий от rsync

Я вообще-то не питонист, а джавист. На проблемы и недостатки питона мне строго пофигу, но если ты считаешь что исключения не нужны вообще, что ты делаешь в ООП?

morse ★★★★★
()
Ответ на: комментарий от rsync

Ага, бестолочь, которая ноет на счёт трейсов ты, а чего-то не понимаю я. У всех идиотов будто одна методичка. А самым первым пунктом в ней написано в любой невыгодной ситуации переводить стрелки.

WitcherGeralt ★★
()

посмотрел на количество комментариев

вброс удался

eternal_sorrow ★★★★★
()
Ответ на: комментарий от rsync

raise ValueError('На ноль не делим')

В данном примере ты сам себя запутываешь. Само деление свалится со стандартным исключением, и именно на той строчке, на которой ты хочешь.

gistart
()
Ответ на: комментарий от rsync

при наличии croak трейс нужен в крайне редких случаях

Ещё раз повторяю: трейс нужен всегда, croak бесполезен. Но тебе нужно хотя бы разок ими попользоваться чтобы это понять.

при отсутствии инструмента, конечно ёжики должны будут колоться и хвалить кактус под названием Python

Ещё раз повторяю: питон умеет делать и трейс, и croak и всё что тебе заблагорассудится.

Поздравляю, ты в своём «ненависти треде» всем показал что твои претензии безосновательны и причина им - только в твоей безграмотности. Лучшей рекламы питону и не придумать.

slovazap ★★★★★
()
Ответ на: комментарий от morse

Я вообще-то не питонист, а джавист

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

rsync ★★
() автор топика
Ответ на: комментарий от Shadow

можно писать

a = foo()
bar(a)

А можно писать

foo(bar())

Второе более наглядно, легче понимается, итп

rsync ★★
() автор топика
Ответ на: комментарий от gistart

В данном примере ты сам себя запутываешь

это синтетический пример.

Само деление свалится со стандартным исключением

свалившись, само деление будет указывать местом ошибки строку с делением. Но место ошибки - это код верхнего уровня.

я всего-лишь хочу указать прямо на место ошибки, а не заставлять пользователя иматься с огромными трейсами.

rsync ★★
() автор топика
Ответ на: комментарий от slovazap

Ещё раз повторяю: трейс нужен всегда

очень сложно разговаривать с человеком о вкусе устриц, при условии что он их не ел.

rsync ★★
() автор топика
Ответ на: комментарий от rsync

Кул стори бро. Не увидел ни слова про исключения, что видимо означает что в питоне они не хужа джавовских, так?

Что впрочем не отменяет того, что твоя фраза «обработка ексепшенов в рантайме == зло» однозначно показывает твой уровень владения что питоном, что джавой, что любым другим объектно-ориентированным языком.

morse ★★★★★
()
Ответ на: комментарий от rsync

это дикость - копание в кучах говна в виде стектрейсов

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

bread
()
Ответ на: комментарий от WitcherGeralt

Иногда словари со значениями в виде лямбд могут заменять switch

Что ж с тобой будет от знакомства с pattern matching'ом?..

3.* не нужен и не считается.

Вроде достойно держался, а тут взял и лопнул.

t184256 ★★★★★
()
Ответ на: комментарий от rsync

я всего-лишь хочу указать прямо на место ошибки

теперь понял, тебе надо:

from libastral import predict_incorrect_usage

@predict_incorrect_usage
def my_foo():
gistart
()
Последнее исправление: gistart (всего исправлений: 2)
Ответ на: комментарий от t184256

Лол. А ведь вчера я посмотрел на товарища и повторил за ним фигню с редьюсом.

Но на самом деле у тебя всё равно не православно, это спец-олимпиада, лямбда для этого вообще не нужна, в питоне давно принято юзать list / dict comprehension:

dict([(i, i) for i in range(5)]) # можно в 2.6
{i: i for i in range(5)} # можно в 2.7(.1?)

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от vvn_black

^ Вон тебе ещё проще.

ЧСХ, после того как скинул свой упоротый вариант, я ещё всю ночь кодил. Видимо, придётся потом разгребать.

WitcherGeralt ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.