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

    −17

    1. 1
    2. 2
    3. 3
    4. 4
    try:  # эталонный говнокод
        height
    except NameError:
        height = -99999

    Запостил: nkonin, 08 Декабря 2015

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

    • Говнокод выше, а именно там, где становится неизвестно, определена переменная или нет.
      Ответить
      • а че в питоне переменные динамические?
        Ответить
        • типизация?
          Ответить
          • то что типизация в питоне динамическая, это я знаю.

            динамические переменные это когда, например, под `if`ом переменной присваивается значение и таким образом переменная создается. в дальнейшем коде, если переменная была создана, то к ней можно обращатся. если переменная не была создана, то обращение к ней будет вызывать run-time ошибку.

            я на питоне мало программировал что бы осознать эту тонкость.
            Ответить
            • Выходит, что динамические http://ideone.com/kmSgeD
              Ответить
              • мне почему то все время казалось что в питоне нормальные правила объявления переменных.

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

                    типа:
                    if True:
                        a = 1
                    print a

                    почти во всех человеческих языках это будет синтаксической ошибкой, потому что `a = 1` существовало - и умерло - вместе с контекстом ветки `if`а.
                    Ответить
                    • это только в си такое есть локальная область видимости ограничена блоком {}
                      в пхп только функциями и неймспейсами ограничена.
                      в питоне аналогично.
                      Ответить
                      • > это только в си [...]

                        и в жабе. и в go. и в функциональных языках. и блин даже в перле. другими словами: подавляющее большинство языков.
                        Ответить
                        • > и в функциональных языках
                          > переменные
                          Ответить
                          • Как всегда... Жопа есть, а слова нет.
                            Ответить
                            • Ну а какие они переменные, если их переменить нельзя? Константы, по сути.
                              Ответить
                              • На этапе создания значение точно меняется...
                                Ответить
                                • Ну физически - да. Всё-таки процы создавать блоки памяти пока не научились. А логически - "переменная" сначала вообще не существует, а потом сразу рождается с заданным значением. Промежуточных этапов нету.
                                  Ответить
                              • постоянные переменные
                                Ответить
                          • открой Пирса, первую главу про лямбда-исчисление, и узнай, как называются эти штуки в функцианальных языках
                            spoiler: variables, они же переменные
                            Ответить
                        • Даже в Lua для local переменных.
                          Ответить
                      • >> это только в си такое есть локальная область видимости ограничена блоком {}

                        штоа????

                        как раз в анси си она ограничена функцией (для автоматических переменных)

                        и в JS тоже

                        а везде в других языках она ограничена блоком
                        Ответить
                        • > как раз в анси си она ограничена функцией

                          Иди-ка почитай стандарт, гость. Даже в сишке 89 года можно объявлять переменные в начале блока.
                          Ответить
                          • Причём я никогда не понимал, почему её нельзя объявлять не в начале блока. Ладно бы ещё заставили писать их в начале функции, как в паскале... Была бы хоть какая-то логика.
                            Ответить
                          • Причём ладно бы ещё разделение деклараций и исполняемого кода, так там, емнип
                            {
                                // работает
                                int foo = get_foo();
                                int bar = get_bar(foo);
                                do_baz();
                            }
                            
                            {
                                // не компилится
                                int foo = get_foo();
                                do_baz();
                                int bar = get_bar(foo);
                            }
                            Так что я не вижу во всём этом абсолютно никакой логики...
                            Ответить
                    • В пистоне, как в JS и некоторых других скриптоязыках, областью видимости переменной является функция. Правда, в JS декларации есть, и они автоматически всплывают в начало скопа функции.
                      Ответить
                      • блин, да всё отличие пистончика от толпы его конкурентов это отсутствие явной декларации
                        Ответить
                  • Не совсем.
                    Если внутри функции это имя (допустим 'a') не используется как локальная переменная - то есть нигде нет выражения 'a = ...', -- то при попытке прочесть её интерпретатор полезеть искать её наверх по скоупам, включая глобальный, а если не найдет, кинет NameError.

                    Если же такое выражение хоть где-то есть внутри функции, но не было вызвано до обращения, то интерпрератор никуда не полезет и сразу кинет UnboundLocalError.

                    https://ideone.com/daKQlt
                    Ответить
                • Мне тоже это странно.
                  Ответить
        • В пхп луа и ко если переменная не существует возвращается nil, а в питоне кидается nameerror
          Ответить
    • https://stackoverflow.com/questions/843277/how-do-i-check-if-a-variable-exists-in-python
      Ответить
      • в ответе, питонов `in` используется - это вроде бы линейный поиск?
        Ответить
        • > это вроде бы линейный поиск?

          Нет. Это поиск в хэш-табличке
          Ответить
      • На myVar ты можешь в иде кликнуть и перейти к определению, посмотреть где она используется, в отличие от ''myVar"
        Ответить
    • Они съели шашлык и поехали прогуляться по центру. А уже под вечер Евгений повёз парня к гостинице "Украина". Они погрузились на яхту-ресторан и, уплетая десерт, любовались видами вечерней Москвы.
      Ответить

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