LINUX.ORG.RU

Питонячьи радости

 ,


0

4

Отступы, блин

Был у меня код вида:

for blah-blah-blah :
    # какой-то код
    if что-то :
         # код
    else:
        # ещё код

Код скопипастил из одного места программы в другой. При этом не заметил как отступы нарушились. Ну вы поняли, да? Стало:

for blah-blah-blah :
    # какой-то код
    if что-то :
         # какой-то код
else:
      # ещё код

И вот это мне стоило довольно большого количества потеряного времени. Условие else: стало относиться не к if, а к циклу for. Учитывая, что тело цикла было достаточно длинным, как-то не бросалось в глаза, что else уехал не туда. Мать-перемать, но код после этого даже почти нормально работал.

Еще уже мелочь относительная, но все же, чего-то не подумав захотел поработать с гугл драйвом прямо из своего кода и недолго думая сделал pip install --upgrade google-api-python-client - и это разрушило всё. Благо, что от юзера, а не рута, вылечилось сносом .local и повторной накаткой некоторых модулей

★★★★★

Последнее исправление: anonymous_incognito (всего исправлений: 3)

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

когда даже в жаваскрипт модули завезли уже с классами?

Кто-то не знает про Moose? Хотя ООП в скриптах не нужно. Я всегда настаивал, что программу размером больше одного файла в сотню строк на перле писать не стоит. Но у адептов другое мнение (хотя уже никому не интересное). Древнему коду же очевидно никакие улучшения языка уже не помогут. Нужно принимать как есть, а не дуриком рефакторить код на языке со слабой типизацией. Такие персонажи тоже встречаются в перловой тусовке.

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

Добавлю, что писаки на жопаскрипте очень похожи на перлово-пхпшных макак из 90-00-х. Тоже пишут тонны какой-то ереси не приходя в сознание на недоязычке для скриптования хомпаги. Время идёт, а макаки не меняются. Сейчас только хуже стало, потому что у перловиков не было особо инструментов и надмозга гпт. Они прям в блокноте фигачили, ну в лучшем случае в Komodo. Так что не очень-то много и успели насрать.

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

Кто-то не знает про Moose?

Что-то слышал про это оверблоатед говно (мнение, кстати, перловщика какого-то, не моё :); то есть даже перл кодерам оно не всем по нраву), накрученное поверх костылей.

Я всегда настаивал, что программу размером больше одного файла в сотню строк на перле писать не стоит.

Я бы на нем вообще не писал, в нем типизация не то что слабая, она вообще укуренная. Если люди всерьез считают, что числа и строки не нужно принципиально отделять друг от друга как типы данных, а валят всё в одну кучу («скаляр»), то их всерьез сложно воспринимать.

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

Хотя ООП в скриптах не нужно.

Интересно даже стало пойчему?

Я всегда настаивал, что программу размером больше одного файла в сотню строк на перле писать не стоит.

Сейчас автор какого-нибудь GNU Parallel прочитает, обидется и не будет дальше поддерживать свою перловщину, которая даже с БД работает и таски в таблицах хранит - монструозный комбайн. Можно было бы еще кучу всего перечислить… Тот же твикс гномосековский, написанный полностью на пистоне.

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

Хотя ООП в скриптах не нужно.

Интересно даже стало пойчему?

Я всегда настаивал, что программу размером больше одного файла в сотню строк на перле писать не стоит.

Это логичное следствие из ограничения в сотню строк кода: если использовать ООП, то пока один класс опишешь, уже выбьешься из рамок. Нет, только стандартные типы данных (они хотя бы быстрые, ибо встроены в интерпретатор, а не в вычисляются из байткода), функции/процедуры, и весь скрипт это реализация алгоритма, по которому работает программа. Короче, как на Бейсике каком, только без GOTO.

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

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

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

в твиксе 3000 строк

По-божески ещё. На самом деле кол-во строк это так себе метрика. У меня есть и скрипты под тыщу строк, но они все равно очень простые и плоские.

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

Даже этот обрыганский пасцаль 21-го века - Golang и тот обзавелся классами и объектами. Там классы что-то типа того что в б-мерзком JavaScript: ты структуру объявляешь, а далее можешь в нее сколько угодно методов добавить. Ну как в чистой сишке, те когда на ваське школьники игры писали они все же могли и реальным программированием заниматься вместо онанизма

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

Потому что аннотации поддерживаются с версии 3.9

Разве? Я не большой знаток третьего питона, гугл пишет аннотации появились в 3.5 и дальше развивались.

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

Там классы что-то типа того что в б-мерзком JavaScript

Ну как в чистой сишке

Даже вот те кто все из этого попробовал видят что JavaScript он никакой не марсианский, а у него ноги из C растут… И возникает вопрос а на чем скриптоненавистники писали? У сишников точно проблем НИКАКИХ абсолютно ни с JavaScript, ни с Lua, ни с Python

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

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

«Скриптоненавистники» это скорее real world problem: они не писали, они поддерживают уже написанное на скриптах и возможно дорабатывают :D. А там вот это всё, никакой статической типизации, на которую можно было бы спустить IDE, чтобы она помогала разбираться в проекте и что-то в нем изменять, чтобы потянув за нос, не отваливались уши.

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

А там вот это всё, никакой статической типизации, на которую можно было бы спустить IDE, чтобы она помогала разбираться в проекте

Она не нужна для синтаксического анализа. А аннотации - это для самодокументируемого кода вместо докстрингов. А статическая тупизация, конечно, очень помогает в языках где можно перегружать операторы и пихать везде макросы… Ну а про LINQ… Хакерский код можно писать на любом языке + есть другая проблема в виде несоответствия уровня погромиста проекту, мне, например, проще писать что-то типа x | 0 вместо Math.floor(x) или if (~s.indexOf('x')) вместо if (s.indexOf('x') !== -1) биопроблемы других меня мало волнуют

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

У сишников точно проблем НИКАКИХ абсолютно ни с JavaScript, ни с Lua, ни с Python

Конечно, сишники эту перхоть просто не замечают. Хотя и среди них есть хейтеры (всего).

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

сначала у него тело цикла на 5 экранов, что не видно, где отступ должен быть. потом он этот цикл копипастит.

интересно, почему у меня ни разу за 15 лет проблем с отступами не было… несмотря на то, что с таким же наркоманским кодом работать тоже приходится.

anonymous
()
Ответ на: комментарий от rtxtxtrx

А там вот это всё, никакой статической типизации, на которую можно было бы спустить IDE, чтобы она помогала разбираться в проекте

Она не нужна для синтаксического анализа.

Нет, нужна. Потому что

А аннотации - это для самодокументируемого кода вместо докстрингов.

Никакой документации для человеков указание типов не несет, зато несет для статического анализатора IDE (или отдельного, вроде mypy), которая благодаря этой инфе сможет показать, что поломается, если ты решишь сменить тип фигни, которая может где-то еще использоваться в проекте. Конечно, можно просто поменять тип, а потом запустить и ждать, что упадет, если что не так, но как-то очково становится на это надеяться, начиная с некоторого объема кодовой базы. Ах да, есть же тесты, ага.

биопроблемы других меня мало волнуют

Отличные качества для командной разработки, жму лапу :)

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

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

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

Никакой документации для человеков указание типов не несет

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

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

Это так не работает. у тебя например есть функция расчета расстояния между двумя парами координат ТЫ НИКАК НЕ МОЖЕШЬ поменять их типы с float, например, на инты или стринги. и никак у тебя стринги там не окажутся вместо флоатов. в питоне такой код упадет, потому что нельзя сложить строку и число… А в Java можно, но Java хорошая, потому что вся такая статическая. Это бред от теоретика

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

Я не понимаю, что ты мне пытаешься доказать своими смешными аргументами, которые сами себе противоречат.

Это так не работает. у тебя например есть функция расчета расстояния между двумя парами координат ТЫ НИКАК НЕ МОЖЕШЬ поменять их типы с float, например, на инты или стринги.

Где не могу, в питоне? И что же мне помешает?

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

А число и число с плавающей точкой?

Вот это вообще шикарно прозвучало:

Java-код не документируется от слова совсем. Там вменяемые названия методов и аргументов работают.

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

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

Так не можешь, потому что далее по коду тогда где-нибудь строка с числом сложится, и все свалится. Учи основы, тогда будешь все понимать. Статическая != строгая типизация. Ты вообще почему-то уверен, что в скриптовых языках (они тоже компилируемые, но не в машинный код, а в байткод как джава) типы автоматом приводятся, а в компилируемых они всегда статические. Из этого и исходят все эти бредни

rtxtxtrx
()

ТСу(и всем скобколюбам ой):

см

The indentation levels of consecutive lines are used to generate INDENT and DEDENT tokens, using a stack, as follows.

in

https://docs.python.org/3/reference/lexical_analysis.html#indentation

СТЭК явных индентентов

наглядней СТЭКа открытых операторных скобок

а

так то и то и то стэк :)

инвариант не предел

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

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

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

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

rtxtxtrx
()

Код скопипастил из одного места программы в другой. При этом не заметил как отступы нарушились.

Коряво сделал – коряво получилось. Если не нравятся отступы, зачем себя мучить-то? Есть куча языков, где блоки по-другому обозначаются.

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

По мне так лучше уж иметь конвенцию под синтаксис типа <statement>..else..finally, чем уродовать синтаксис дополнительными разделителями при наличии отступов-разделителей или менять название тех же по смыслу и функции блоков, описывающих ветви исполнения.

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

Простите, вы уже работаете или ещё учитесь? Просто для студента извинительно не знать, что ин да риал бизнес всё совсем не так, как на лекции рассказывали. Не то чтоб вам учителя врали, просто проблемы имеют другие приоритеты. И последствия. Поэтому пятнадцатиминутная работа «поменять конфиг, перезапустить сервис, проверить результат, откатить в случае неудачи» превращается в трёхнедельный менеджерский марафон с совещаниями, согласованиями и длинной перепиской в слаке, почте и снова в слаке. Ответ на ваше предложение может быть только такой: „Спасибо за предложение, мы обязательно рассмотрим его, как только найдём время. Оценочно: в третьем квартале 2025. Но это не точно“.

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

Я вижу, ты совсем отбитый :). Полагаю, всем остальным это тоже очевидно, написал ты предостаточно.

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

Кто и что высрет, если аннотации, которые я написал, писать, по твоему мнению, не надо — ведь строгая типизация питона всё порешает? Не будет там ничего, будет:

def foo(): # в жопу сигнатуры - у питона строгая типизация! упадет в рантайме, если что (надеюсь)
    ...
    return "foo"
    ...
    return baz() # хэ-хэй, мы в реальном мире - функции имеют больше одной строки и возможно несколько точек выхода, потому что так удобнее!

def bar(s):
    l = [s*i for i in range(10)]
    return l

bar(foo())

# few months later

def foo():
    ...
    return "foo"
    ...
    return 1 # про `bar` я уже не помню, но мне захотелось заюзать `foo` в `quux`, а там всё равно я в строку перевожу сразу объект, поэтому неважно, что передавать.

bar(foo()) # хорошо, что строгая типизация не позволила случиться ошибке... или нет?
Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Твои примеры - это какой-то идиотизм. Они ничего не доказывают. Ты сам себе придумал проблему, сам с ней борешься. Классические соломенные чучела у демагогов. Аннотации заменяют такие мега-портянки:

"""
Эта функци делает что-то...

:param int foo: тут описание, но если дать вменяемое имя, оно не нужно
:param bool bar:
"""

В более продвинутых фреймворках типа FastApi аннотации обрабатываются и параметры из query string, тела запроса к ним приводятся.

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

аннотации поддерживаются с версии 3.9, а в некродистрах типа вонючего дебиана говно мамонта вместо питона.

> python Tab python python2.7 python3 python3.9

> uname -a Linux ***** 5.10.0-26-amd64 #1 SMP Debian 5.10.197-1 (2023-09-29) x86_64 GNU/Linux

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

Твои примеры - это какой-то идиотизм. Они ничего не доказывают.

Еще ни один упорант не внял гласу разума, кто ж спорит :). УМВР никто не отменял, ахахахаха.

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

потому что это**bar(s: str)**не является проверкой типа. если таковая нужна - напиши её

if type(s)!= str:return

Не старайся, в одну палату с @rtxtxtrx ты не попадешь. И по-моему, вместо type как-то покошернее всегда было использовать isinstance, хотя я мог что-то пропустить.

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

я не питонист и не разработчик если что.

«тип неверен - ничего не делать» твоё самолюбие задело, а

def foo() -> str:
    return "foo"

нет?

мы обсуждали идею, а не кусок энтерпрайзного кода. опытный разработчик это заметил бы. не так ли?

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

для определения типа ты можешь использовать что угодно, что для этого предназначено. проблема в том, что ты решил, что bar(s: str) - предназначено и ругаешь язык за то, что он ведёт себя не так как ты себе нафантазировал.

flant ★★★
()
Ответ на: комментарий от flant
  1. Аннотация типов помогает работе IDE: редактор даёт подсказки, правильно приводит списки методов и т.п.
  2. Приведённый код молча факапит исполнение программы.

Не пойму, как эти идеи могут быть связаны. Между ними буквально ничего общего, как между шпалой и дождём.

wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 2)