1. Python / Говнокод #13209

    −102

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    a=[1,2,3,1,2,1,4]
     
    for i in a:
        if i is 1:
            zzz=222
        else:
            print zzz

    http://ideone.com/nhqqRU
    Сегодня весь день чинил странный баг, смысл которого сводится вот к такой синтетки.
    Притом если условие не выполниться на первой итерации http://ideone.com/G3Uf7V , то будет эксепшен.

    Запостил: хуита, 21 Июня 2013

    Комментарии (20) RSS

    • По моему все логично, что конкретно смущает?
      Ответить
    • А зачем применять при сравнении is?
      Ответить
    • Весь день??
      Ответить
    • > то будет эксепшен
      А вы хотели Notice, как в PHP?
      Ответить
    • Разумеется будет эксепшен. Переменная будет создана (выделена память и создана запись в словаре локальных переменных) только при выполнении строки 5. Если обратиться к ней до этого, то нужного имени среди локальных переменных не будет.

      is тут не к месту, впрочем.
      Ответить
      • Ах да, питонохуйня. У меня это в таком виде проявлялось:
        for i, x in enumerate(lst):
            ...
        # операция с i

        Если список пустой, вылетало с UnboundLocalError. Для привыкшего к языкам с обьявлением переменных непривычно, и главное - проявляется в рантайме при нужном расположении звезд.
        Ответить
    • по-моему, вообще плохая идея обьявлять переменную в одном блоке, а юзать в другом.

      или как еще пхпшники любят делать
      if(чавойта())
        $оно=питушня();
      else
        $оно=поебень();
      хуита($оно);

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

        Даже с final'ом компилит: https://ideone.com/PbEcaC
        Ответить
        • нет, 10й строки не должно быть, в том и дело.
          Ответить
          • А, ну так это проблема всех языков, в которых не надо объявлять переменные.
            Ответить
            • проблема в том, что переменная видна даже при выходе из блока, с момента первого присваивания. потому мой пхпшный код выше я считаю хорошим тоном написать так:
              $оно=0;// ну типа обьявление и значение для всех непредусмотренных ситуаций;
              if(чавойта())
                $оно=питушня();
              else
                $оно=поебень();
              хуита($оно);
              Ответить
              • > проблема в том, что переменная видна даже при выходе из блока
                А это просто следствие того, что переменные не нужно объявлять - без объявления не получится сделать нормальные скопы.
                Ответить
                • поясните, почему это такая проблема?
                  Ответить
                  • 1) Если объявлять переменные, даже не указывая тип - можно ограничить скоп, в котором она активна - меньше шансов на ошибку. Без объявления скопом будет в лучшем случае вся функция, а в худшем - нечто более глобальное.
                    2) При объявлении переменных можно получить ворнинги про "uninitialized variable", что иногда полезно.

                    А так - конечно, можно писать и без этого, но как-то неприятно.
                    Ответить
                    • пых ограничивает скоп функцией а в внутри блока все переменные доступны если используется ниже объявлдения т.е.
                      код из серии "Счастливой отладки суки".

                      if(чавойта())
                      $оно=питушня();
                      хуита($оно);
                      Ответить
                      • > код из серии "Счастливой отладки суки".
                        Нотис же будет, если чавойта() не выполнится не?
                        Ответить
    • Ну меня тоже посетила мысль, что в жабе бы я сей баг не искал.
      Даже в Node.js при 'use strict' уже будет эксепшен.
      >Разумеется будет эксепшен.
      И этозамечательно! Лучше ловить эксепшены, чем чинить баги.
      >Весь день??
      Так я на отходосах был.
      Ответить
      • > Лучше ловить эксепшены, чем чинить баги.
        как сказал один мой коллега,
        "пусть лучше громко перднет, чем предательски набздит... чтобы было видно, откуда говно потекло"
        Ответить
      • > Даже в Node.js при 'use strict' уже будет эксепшен.
        'use strict';
        
        var a=[1,2,3,1,2,1,4];
         
        for (var i in a){
            if (a[i] == 2) // 2 != 1
                var zzz=222;
            else
                console.log(zzz);
        }

        Эксепшн будет только, если не писать "var" (но какой JS без var?), а аналог питонокода, представленный мной выше, успешно отработает, и это норма.
        Ответить

    Добавить комментарий