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)

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

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

А вообще из-за этих отступов у меня мысль, у Гвидо случайно ОКР не диагностировали?

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

Оно просто как-то странно сработало именно в твоём случае. Почему-то пробелы уехали не везде, а именно в одном месте.

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

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

С тех пор для питонячьих файлов использую только две утилиты - sublime и pycharm. На удалённом сервере можно конечно что-то подправить через vim или nano, но вот копипаст из них через окно терминала уже будет кривым.

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

Оно просто как-то странно сработало именно в твоём случае. Почему-то пробелы уехали не везде, а именно в одном месте.

Они вообще все уехали, я вручную их правил, но случайно пропустил с else.

anonymous_incognito ★★★★★
() автор топика

Мать-перемать, но код после этого даже почти нормально работал.

Тут прикол, что Гвидо не только разложил грабли отступов, а ещё и подсунул мину под for в виде else блока. Вот зачем он ещё нужен кроме как ноги отрывать неуклюжим копипастщикам?

bread
()

в idle сырец(этому коду лет как Pythonу +-) для туды сюды :

    def indent_region_event(self, event=None):
        "Indent region by indentwidth spaces."
        head, tail, chars, lines = self.get_region()
        for pos in range(len(lines)):
            line = lines[pos]
            if line:
                raw, effective = get_line_indent(line, self.editwin.tabwidth)
                effective = effective + self.editwin.indentwidth
                lines[pos] = self.editwin._make_blanks(effective) + line[raw:]
        self.set_region(head, tail, chars, lines)
        return "break"

    def dedent_region_event(self, event=None):
        "Dedent region by indentwidth spaces."
        head, tail, chars, lines = self.get_region()
        for pos in range(len(lines)):
            line = lines[pos]
            if line:
                raw, effective = get_line_indent(line, self.editwin.tabwidth)
                effective = max(effective - self.editwin.indentwidth, 0)
                lines[pos] = self.editwin._make_blanks(effective) + line[raw:]
        self.set_region(head, tail, chars, lines)
        return "break"

т.е. при копипасте прогонять через фильтр(возможно подобный когда то был в Tools у СPython сырцов версий изначальных) который для заданного блока выставляет нужное на выходе количество Indent

qulinxao3
()

Была какая-то книжка по пистону лет 15 назад. В её русском переводе в первом издании в примерах кода были напрочь похерены все отступы. Т.е. их там просто не было.

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

Индент в питоне это именно аналог открывающей скобки. Вот и копировать сниппеты надо от начала строки, а вставлять отдельным параграфом, чтобы границы сниппета не потерять (еще лучше оформить комментариями):

for i in range(100):
    ...
###############
сюда копипастим сниппет
###############
    ...

И ничего не забудется, и сколько уровней индентации надо добавить/убрать видно сразу.

А вообще, я что-то подумал, а нет ли в теплом ламповом Саблайм Тексте такой фичи, чтобы выделил код, выбрал нужный уровень индентации, и он инденты исправил в выделенном участке. Мультикурсором вручную тыкать утомительно очень, хотя можно и его приспособить, но это ж всё вручную придется делать. По идее написать плагин просто, но может уже есть такой, ибо лень :).

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

Вот и копировать сниппеты надо от начала строки, а вставлять отдельным параграфом, чтобы границы сниппета не потерять (еще лучше оформить комментариями):

В языках со скобками вместо отступов ничего такого не надо. ¯_(ツ)_/¯

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

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

Virtuos86 ★★★★★
()

я конечно не разработчик, а больше кодер (скрипты на codewars, ansible roles, groovy чутка ) и задам вопрос, который меня все время мучает
какого саныча отступы это решают ?
ничего нельзя было получше придумать ?

у меня все.
всем лучи добра!
пы.сы. извините за глупый вопрос

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

я понимаю что это смешно разрабам, но таким как я (недокодерам) чинить такое дерьмо потом часами.
например в ansible тоже самое (cка как я ненавижу yaml).
ну вот один лишний таб нажал и час хвосту под кот.

dada ★★★★★
()

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

Python - не предназначен для реальной разработки чего-то сложного. Это учебный язык. Те кто его используют для чего-то еще - делают это по глупости.

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

я понимаю что это смешно разрабам, но таким как я (недокодерам) чинить такое дерьмо потом часами.

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

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

В языках со скобками вместо отступов этого бы не произошло. ¯\(ツ)

Да и в языках без скобок такого бы не произошло ¯\(ツ)/¯ Но питон это питон, он душит, молча. Ты смотришь в буквы кода и там всё правильно, а программа работает не правильно у тебя начинается шиза и ты попадаешь в дурку. Где выравниваешь все предметы на столе, полках, мебель на полу друг относильно друг друга, а оно не работает ты пробуешь отодвинуть стул на 4 шага проверяя относится ли он к столу садишься и недотягиваешься до каши, опять не работает, наверное нужно подвинуть весь блок с палатами, идёшь садишься в трактор и таранишь клиннику пытаясь сдвинуть корпус больницы на 4 метра вглубь


Наверняка кто-то уже сделал препроцессор для питона где границы блоков кода можно обрамлять явно {} или thenend чё мучиться =)

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)

Очередное обсуждение очень важных вопросов программирования и разработки.
Кто же победит тупоконечники или остроконечники. Какой же из тюрингполных языков самый тюрингполный. Какие закорючки правильнее ставить в конце строки.
Зрители застыли в ожидании.
Горжусь ЛОРом и уровнем дискуссий.

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

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

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

А ещё разводняк это висящие строки циклов и условий без скобочек в СИподобных.. ещё разводняк это = в условиях и т.д. и т.п. Много разводняков-то вокруг, много.

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

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

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

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

Кто знает, пока медсестра бегает в туалет я выбегаю из палаты и пишу на ЛОР. Ой кажется она идёт! Скорее в палату! 🏃

Пошутить уже нельзя :(

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)

Это учебный язык.

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

Похоже, что отступы это такая защита от тупого копипаста кода учениками без осмысления самого кода.

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

Во-первых, обязать настраивать редактор, чтобы делал питоноугодные отступы

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

В-третьих, автоматизированное тестирование нацелено на выявление вот таких косяков.

100% покрытие тестами это дорогое удовольствие подходящее восновном для супер цивильных библиотек, а вообще тесты пишут те же живые люди, те же что и код чаще всего или даже стажеры

Syncro ★★★★★
()