LINUX.ORG.RU
ФорумTalks

Плохой Питон

 ,


0

5

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

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

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

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

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

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

croak

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

★★
Ответ на: комментарий от templarrr

видишь, питонист выделяет не то что является ключевым во фразе

ты выделил не «повторному» (что было ключевым), а «изучению»

это как с вот этим тупым питоньим примером:


dir='/'.join(['path','to','dir'])

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

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

Зачем ты изобретаешь оправдания для отсутствие чего-то потенциально нужного? Потоков нет, всё, факт, не может быть никакой дискуссии «а нужны ли потоки». Потоки нужны, в питоне их нет. Дросублимацией все уже привыкли заниматься, но это ничего не отменяет и не оправдывает.

По поводу js - не вижу принципиальной разницы и почему это не «выглядит инородным» там, но выглядит в питоне

И что, и даже .send(None) не смущает?

например пытаюсь засунуть в список элемент не того типа или у меня нет return т.е. вернется None вместо нужного типа

За годы в питоне ты просто привыкаешь так никогда не делать, и всё, не нужны прикрученные сбоку пустышки. А это натуральная пустышка. Сравни нужность потоков и нужность этого, разница очевидна.

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

просто ППЦ

setuptools при наличии тестов в каталоге tests почему по умолчанию не запускает их при обработке?

то-то!

pip install почему не запускает/не инсталлирует тесты пакета при инсталле?

то-то!

будете рассказывать про культуру? нет её в Python

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

Потоки нужны, в питоне их нет

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

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

Там много букв и кстати написано:

For a shorter message you can use carp() or croak() which report the error as being from where your module was called. shortmess() returns the contents of this error message. There is no guarantee that that is where the error was, but it is a good educated guess.

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

почти - не считается.

что такое переменная в скриптовом языке? это структура на языке С с n полями (счетчики ссылок, типы, значения итп)

что такое структура на глобальном уровне? (уровень модуля == тоже глобальный)

это доступ к ней отовсюду

что такое доступ к структуре отовсюду (с разных потоков)?

это mutex около структуры.

дальше объяснять, почему нормальная реализация потоков в языке, предполагающем подобный синтаксис невозможна?

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

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

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

а тут - обычный неинформативный exception и всё.

«я ничего не знаю, знать не хочу, но мнение имею»

tests/test_commands.py::test_equals FAILED
=== FAILURES 
___ test_equals

    def test_equals():
        a = A()
        b = {1, 2, 3, 4, 5}
>       assert a == b
E       assert <tests.test_commands.A object at 0x7fd9a1381a58> == {1, 2, 3, 4, 5}

tests/test_commands.py:60: AssertionError
gistart
()
Ответ на: комментарий от rsync

Вот чего ты тут капитанишь? У меня даже слов нет. Без тебя блядь никто не знал, я наверное полагал, что GIL туда по фану засунули или из вредности.

Но нет, ты порешь херню. Множество локальных мьютексов лучше одного глобального. И PyPy-STM это прекрасно пруфает работая в разы быстрее CPython.

И если это не нормальная многопоточность, то ладно, мне и так сойдёт, лучше уж ненормальная, зато многопоточность.

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

Абстракции ради абстракций, тут уж слишком далеко зашли.

WitcherGeralt ★★
()

Не люблю питон, но ты просто неосилятор.

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

ты выделил не «повторному» (что было ключевым), а «изучению»

Ну так только для перловика изучение кода - это проблема. Даже повторное.

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

Но потоки есть, просто есть gil. Как и во всех других подобных языках. Но это фича cpython, в jython или ironpython, например, их нет.

Еще там нет, например, оптимизации хвостовой рекурсии. Кому-то это нужнее.

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

Угу, но так получается, внезапно. Например генерировал какой-то json, забыл, что там формат немного изменился, а ide мне подсветила, что я что-то не то кладу.

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

Это тоже неправильный код, питон переносим, у os.path.sep может быть разным, надо использовать os.path.join('path', 'to', 'dir')

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

А ведь на перле можно тоже нормально писать...

Это не свойство и не заслуга языка, когда это - исключение.

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

Так чего сказать-то хотел?

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

Во фрю 2.7 только-только официально завезли, а ты предлагаешь добить.

Еще как предлагаю, теперь еще и фрю! Овер десять лет отставания - шутка ли?

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

а тут

тут это где ?

лог тестирования

когда я последний раз использовал python был nose, он пропал куда ?

pip install почему не запускает/не инсталлирует тесты пакета при инсталле?

потому что моя машина не для запуска чужих тестов

будете рассказывать про культуру? нет её в Python

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

нет её в Python

а еще ты видимо не очень адекватен, если поведение требуемое от человека приписываешь языку, мне ничто не мешает на любом языке не писать тесты, так же как и описывать их нормально тоже на любом, как на perl, так и на python

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

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

Меня выше спросили чего я имел ввиду под удобным сочетанием лямбд и словарей. Я ещё и пример DSL на лямбдах и словаре привёл.

Овер десять лет отставания

Это не отставание, это выдержка.

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

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

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

что GIL туда по фану засунули

вот именно. решение в текущей семантике (глобальные переменные в потоках) приводят к GIL. а GIL == проигрыш в быстродействии чем больше потоков тем бОльший

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

Зависит от того как много данных они делят. Да и наличие всё же лучше отсутствия. Ты бложек на pypy.org уже нашел или тебе ссылку дать, чтобы ты почитал про производительность с STM?

Оно, конечно, загнулись, но не под гнётом убогого однопоточно CPython, а под гнётом своей же реактивроной jit, которая без STM работает заметно быстрее потоков. Бинарники до сих пор можно скачать попробовать, ну или сорцы, если угодно.

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

В cpython тоже впиливали локи и убирали GIL. В итоге однопоточный код стал медленней. Поэтому это не вошло в cpython. С pypy сравнивать некорректно, там jit.

Но если тебе нужна производительность именно числодробления на питоне(а не библиотекам на си, которым, кстати, может быть ппофигу на gil), то ты выбрал не тот инструмент для задачи. Для многих применений потоки питона работают как надо(задачи завязанные на ввод-вывод, gui в отдельном потоке и т.п.)

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

Ты разговор от темы не уводи. Фича — говно. А библиотека, будь она сколь угодно стандартной, может и сосать. Таких примеров множество, причём в самом же питоне.

Лично я никак это использовать не собираюсь, ни с библиотекой, ни без, после Go это слишком трешово. Но, если бы юзал, то хотя бы даже под влиянием NIH-синлрома, мне бы наварняка понадтбился свой ивент луп. Я уже так делал ещё на втором питоне (слегка хакал стардартный httplib, чтобы соедирения не блокировались под long-poll и гонял это в рукописном ивет-лупе). Мне могло бы, например, понадобиться что-то подобное портировать, ничего при этом не ломая в апи. Хотел бы я в таком случае использовать стандартные средства языка, чтобы улучшить старое решение? Разумеется. Но мне пришлось бы либо сендноунами заниматься, либо всё выбросить.

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

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

Самый забавный таракан питона. Тут напрашивается обобщенная функция join(iterable, str). Казалось бы, в чем проблема? Но нет, у нас же ООП, все как у взрослых. Все да не все, некуда ведь впендюрить такой метод кроме как в строковый класс. Нету интерфейсов или миксинов. Ну значит впендюрим в строки, и ничего что выглядит лютым черезжопием, зато ООП блджад. А в других местах функции незазорно юзать почему-то.

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

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

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

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

когда я последний раз использовал python был nose, он пропал куда ?

такое же УГ, как и pytest

потому что моя машина не для запуска чужих тестов

поэтому и держат зоо питонов: оттестировать же не могут код, соответственно 2.7, 3.4, 3.6 в средней убунте

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

язык формирует субкультуру, субкультура формирует язык. язык это не только язык, но и его стандартные либы/средства поддержки

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

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

ЕМНИП даже в JS join нормально сделан:

> a = [1,2,3]
[ 1, 2, 3 ]
> a
[ 1, 2, 3 ]
> a.join(';')
'1;2;3'
>

а у питонячины тут еще и ексепшены гыгы:

>>> a = [1,2,3]
>>> ';'.join(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected str instance, int found
rsync ★★
() автор топика
Ответ на: комментарий от rsync

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

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

сильная типизация - тоже зло.

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

  >>> a = [1,2,3]
  >>> ';'.join(map(lambda x: str(x), a))
  '1;2;3'
  >>>
rsync ★★
() автор топика
Последнее исправление: rsync (всего исправлений: 2)
Ответ на: комментарий от pawnhearts

Можешь писать str.join(',', ['a','b','c')

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

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

Потому что «явное лучше неявного».

- чем лучше?

- чем неявное!

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

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

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

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