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

    0

    1. 1
    2. 2
    3. 3
    4. 4
    XRU = "XRU"
    PITUH = "PITUH",
    KUROCHKA = "KUROCHKA"
    PETUH = PITUH.replace('I', 'E')

    Traceback (most recent call last):
    File "./prog.py", line 4, in <module>
    AttributeError: 'tuple' object has no attribute 'replace'

    Запостил: 3_dar, 02 Марта 2021

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

    • Багор.
      Ответить
    • а зачем запятую вставил?
      Ответить
      • Случайно
        Ответить
        • Тупла вообще малоприятный тип. Зачем он нужен в языке -- я не понимаю.
          Ответить
          • Ели туплы мужики, пивом запивали!
            О чем Гвидо говорил, они не понимали!
            Ответить
          • В основном из-за ключей в мапе, как я понимаю.

            Мутабельные вещи ключами стрёмно пихать т.к. инварианты дерева могут рассыпаться.

            Ну и для разврата нескольких значений из функции. Возможно, это немного эффективнее чем лист.
            Ответить
            • >В основном из-за ключей в мапе, как я понимаю.
              так сделали бы frozen list, нафиг сущность заводить?

              >Ну и для разврата нескольких значений из функции.
              типа как pair?

              опять таки, почему не frozen list?

              >эффективнее
              в скриптушне разве я должен про это думать?
              Ответить
              • А frozen list не сущность?
                Ответить
                • не отдельная сущность. У него не было бы например своего синтаксиса для записи
                  Ответить
                  • И как его отличить от обычного?
                    Ответить
                    • а зачем его отличать?

                      знаеш такую хуйню в JS

                      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze

                      ?
                      Ответить
                      • Зачем создавать мутабельный объект и вызывать какие-то методы, чтобы сделать иммутабельным, когда можно сразу создать иммутабельный тупел, оптимизированный для этой задачи, без лишних телодвижений?
                        Ответить
                        • потому что чем меньше разного синтаксиса и разных понятий -- тем лучше, кмк
                          Ответить
                          • Тогды, если говорить о высокоуровневом говне, я бы лучше глиста убрал. И синтакс проще, и багров меньше.
                            Ответить
                            • оставил бы тока иммутабельную туплу?
                              Ответить
                              • Угу. А листы из неё собирать как в лиспе (a, (b, (c, None)))
                                Ответить
                                • Память меня подводит

                                  Это ведь то же самое, что и (a . b . c) ?
                                  Ответить
                                  • Я не помню как точки работают. Всегда юзал что-то в духе (list a b c) для краткой формы.

                                    И вообще мой пример в питоньем синтаксисе.
                                    Ответить
                                    • В "PHP"?
                                      Ответить
                                    • list и pair это не одно и то же

                                      Надо освежить память. Но лень...
                                      Ответить
                                      • Лист состоит из пар, насколько я помню. Просто краткий синтаксис.
                                        Ответить
                                        • Да там пиздец

                                          https://docs.racket-lang.org/guide/Pairs__Lists__and_Racket_Syntax.html
                                          Ответить
              • > frozen list

                Тупл это обычная математическая питушня, а Гвидо был тем ещё ма-те-ма-ти-ком.

                Кроме того, он сам по себе отличается от листа. У тупла даже размер меньше чем у списка.

                > Эффективнее

                В одной ОС для домохозяек не подумали об эффективности, и рабочий стол там сортирует иконки суперпузырьком )))
                Ответить
                • если это математическая питушня, то зачем питухи используют ее как ридонли лист? и зачем вообще такая питушня?


                  >эффективности

                  скриптоговно без JITа где каждый питух работает по ссылке это конечно офигенно эффективно, именно замена листа на тупл нас всех спасет)
                  Ответить
                  • > если это математическая питушня, то зачем...

                    Фиксированный набор значений определённой длины. Зачем ему быть изменяемым? Если ты изменил значение, то, очевидно, это уже другой набор. Не изменяй.

                    > зачем вообще такая питушня?

                    Она эффективнее, она удобная для своих кейсов каких-то. С помощью неё можно писать на питоне в функциональном стиле, который тебе так нравится.

                    > скриптоговно без JITа

                    Скриптоговно с JITом, конечно, будет сильно эффективнее. Если программист – кодер. А вот настоящий программист критические места перепишет на сишку, либо использует модуль, который подключает сишку. Потому что JIT – это полумера.

                    > замена листа на тупл нас всех спасет

                    Это капля в море. Но нельзя забывать, что море состоит из множества капель.
                    Ответить
          • Какие ещё варианты сделать множественный гетерогенный типизированный возврат из функции? В некоторых языках ещё и с именованными полями
            Ответить
            • Ну хотя тред же про Питон

              В нём не знаю, зачем отдельно
              Ответить
            • > множественный гетерогенный типизированный возврат из функции

              В Lua, к примеру, это просто специальный синтаксис. Никакие туплы там не создаются и не возвращаются, просто на стек пушится несколько результатов.
              Ответить
              • Не знаю, что сказать

                Кроме того, что это не помешало златохую уйти из программирования
                Ответить
                • function test()
                      -- пушит 2 числа на стек
                      return 42, 100500
                  end
                  
                  -- снимает 2 числа со стека
                  a, b = test()
                  
                  -- снимает одно число и дропает второе
                  a = test()
                  Ответить
                  • А если я хочу только второе число?
                    Ответить
                    • _, b = test()

                      З.Ы. Можно и все в таблицу захватить: t = {test()}
                      Ответить
                      • А оно не сохранит в «_» первое число?

                        В питоне можно так:

                        b = test()[1]
                        Ответить
                        • > А оно не сохранит в «_» первое число?

                          Сохранит конечно... Боишься, что память потечёт?
                          Ответить
                          • можно сразу следом написать
                            _ = nil
                            не?
                            Ответить
                            • На самом деле, первое значение обычно самое важное, его редко дропают.
                              Ответить
                              • насколько идеоматично вернуть таблу вместо нескольких значений?
                                Ответить
                                • Х.з., я сварщик не настоящий. Табла хуже по пирфомансу, так что это скорее для случаев, когда тебе реально надо таблицу/объект/массив вернуть.

                                  А мультиразврат -- это просто всякие мелочи в духе key/value, error/result и т.п.
                                  Ответить
                                  • пнятно, что хуже, там целый объект в память среца.

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

                                    А два можно и через запятую.

                                    В питоне есть тупла о девяти числах для представления времени, и конечно за такое нужно гореть в аду
                                    Ответить
                  • таким языком можно пытать разведчиков и шпионов
                    Ответить
                    • Эм, а что не так в этом примере?
                      Ответить
                      • да могу только догадываться, как потом читать такой код

                        вот тут мы приняли значение, а, оказывается, могли два. а может даже и три! скриптуха такая скриптуха

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

                          Ну вернут тебе кортеж в питоне, и откуда ты знаешь сколько там членов, какой у них смысл, и вообще что тебе вернули кортеж?
                          Ответить
                          • ну и это типа заебись?

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

                              Но мы же сравнивали кортеж в питоне изначально с мультивозвратом в луа.
                              Ответить
                              • Кортеж лучше. Функция возвращает два значения независимо от того, сколько нам нужно, и питоновский кортеж делает это более явно.
                                Ответить
                                • почему более явно?
                                  В чем разница?

                                  Зачем вообще кортежи в скриптушне? Почему не возващать стурктуры/объекты как в JS или lua, или не делать вот мультвозврат?

                                  Вообще чем меньше типов данных в СКРИПТУШНЕ - тем лучше. Потому что тем она проще. А перформанс это не про скриптушню.

                                  В питоне очень много типов, куда больше, чем нужно.

                                  А в луа их вроде всего 3
                                  Ответить
                                  • Для error, result тоже делать структуру?

                                    Ты ещё кресты поругай за struct / class )))

                                    А ещё можно сделать скриптушню с ASM синтаксисом. Там вообще не будет типов данных!
                                    Ответить
                                    • да, а что такого?

                                      мне проще запомнить имя поля, чего его порядковый номер, не?
                                      Ответить
                                      • Мне тоже, если честно. Но захламлять код такими структурами тоже не очень хочется, особенно скриптовый. Да и всё равно придется доки читать, раз уж скриптуешь, чего бы и не посмотреть что функция возвращает, благо в питоне документация есть прямо в интерпретаторе.
                                        Ответить
                                        • но почему захламлять?
                                          скриптушня должна иметь структурную або утиную тупизацию, не требовать явного создания объекта:

                                          return {
                                          foo: 12,
                                          buz:14
                                          }
                                          Ответить
                                          • Ты не поверишь, но в питоне такое есть!

                                            return ({
                                            "foo" : 12,
                                            "bar" : 14
                                            })
                                            Ответить
                                    • > скриптушню с ASM синтаксисом

                                      forth?
                                      Ответить
                                    • Разнообразные типы данных нужны для двух вещей

                                      * для пифоманса
                                      * для статического анализа кода

                                      Если ничего этого тебе не нужно, то и типы плодить не нужно.
                                      Ответить
                                      • А вообще я за Остерхаута (ну и за TCL, само собой)

                                        https://en.wikipedia.org/wiki/Ousterhout%27s_dichotomy

                                        Он очень хорошо объяснил зачем нужно скриптоговно, и почему из скриптоговна не нужно делать серьезный язык
                                        Ответить
                                        • взгляд из 90х когда статически типизированные языки требовали изъебов чтобы описать какой-то тип, а скриптовые языки писали в notepad++ и файлы по ftp загружали на сервер

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

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

                                          пытаться управлять сложностью с помощью выбора языка это 90е какие-то

                                          да и разница между компиляцией и интерпретацией сейчас размылась из-за jit
                                          Ответить
                                          • >сейчас динамически типизированный js выигрывает

                                            Чтобы понять, что это не так, достаточно мысленно сравнить работу с целыми числами в С++ и в JS, где они представлены как floating point.

                                            Или вспомнить сколько тактов процессора занимает удаление стурктуры со стека (изменение значения указателя на стек) и удаление объекта из кучи через GC.

                                            >да и разница между компиляцией и интерпретацией сейчас размылась из-за jit

                                            А это правда, хотя JIT есть далеко не в любой скриптухе.
                                            Ответить
                                            • >Чтобы понять, что это не так

                                              js выигрывает не у плюсов а у чисто интерпретированного js

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

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

                                                Я согласен, что ситуация изменилась , и границы размылись, но на это размытие была потрачена уйма времени.

                                                Люди начали писать большие сложные системы на япах, для них не предназначенных, и начали вдруг ахуевать от неудобств, и теперь завозят тайпхинты в питон, компиляторы TS в JS, и прочие KittensPHP.

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

                                                  в 2000 нельзя было сказать "парни, попуститесь, всего через 11 лет будет прекрасный язык котлин", пришлось писать на питоне или на джаве, что заняло бы в несколько раз больше времени

                                                  и это привело нас к тайпхинтам и hack
                                                  Ответить
                                      • Мне нужно и первое, и второе, потому что не всегда можно сделать С++ вставку с ассемблерной вставкой.
                                        Ответить
                                        • тогда возьми koltin, java или c#.

                                          зачем тебе скриптушня?
                                          Ответить
                                          • Потому что когда я установлю Линукс на флешку, мне захочется написать программу.
                                            Ответить
                                            • Почему не на с++?

                                              В общем наша с Остерхаутом мысля в том, что скриптушня нужна чтобы писать небольшие тупые скрипты.

                                              Потому там не должно быть много структур, не должно быть стат типизации, и прочих сложностей.

                                              Хочешь серьезного программирования -- бери другой изык.

                                              И мне всегда немного смешно, когда питонобляди выбирают там взять кортеж или словарь , и говорят "кортеж быстрее" или "а зато для словаря у нас есть typed dicts, и мы можем статически проверить тип поля"

                                              Если вас все это ебет, то нахуй вам скриптушня-то
                                              Ответить
                                              • ну вот сам факт существования таких статей это багор кмк

                                                https://medium.com/@jacktator/dataclass-vs-namedtuple-vs-object-for-performance-optimization-in-python-691e234253b9
                                                Ответить
                                                • Error 1020
                                                  Ответить
                                                • > When Coding for Trading, optimization is heavily valued, and coding for performance needs to become a second nature.
                                                  > It is for this reason, majority of Financial Trading systems are written in C, C++, Python or Java.

                                                  Он идиот?
                                                  Ответить
                                                  • Разумеется! «Java» же тормозит. Это каждый петух знает.
                                                    Ответить
                                                  • В статье про оптимизацию питоньих объектов — ня слова про '__slots__'. Идиот.
                                                    Ответить
                                                    • Код на питоне лучше всего оптимизируется переписыванием на Си.
                                                      Ответить
                                                    • Интересня. Это чтобы сделать фиксированный список свойств, как при статической типизации?
                                                      Ответить
                                                      • Да.
                                                        Обычные объекты в Python содержат внутри себя словарь '__dict__', который хранит все свойства инстанса. Это позволяет, няпример, добавлять свойства динямически:
                                                        class X:
                                                            def __init__(self, x):
                                                                self.a = x
                                                        
                                                        
                                                        x = X(16)
                                                        print(x.a)  # 16
                                                        
                                                        
                                                        print(x.b)
                                                        Traceback (most recent call last):
                                                          File "<stdin>", line 1, in <module>
                                                        AttributeError: 'X' object has no attribute 'b'
                                                        
                                                        
                                                        x.b = 42
                                                        print(x.b)  # 42

                                                        За это, как ты понимаешь, приходится платить медленным доступом (каждый доступ к атрибуту — это поиск в словаре), и приличным увеличением потребления памяти: словарь, приклеивающийся к каждому инстансу, это тяжело.

                                                        __slots__ же ограничивает возможные атрибуты инстанса, сильно экономя память и прилично (по няпроверенным данным — ня 15-30%) ускоряя доступ к свойствам. За это приходится платить нявозможностью добавлять свойства в динямике:
                                                        >>> class Y:
                                                        ...     __slots__ = ('a', 'b')
                                                        ...
                                                        >>> y = Y()
                                                        >>> y.a = 1
                                                        >>> y.b = 2
                                                        >>> y.c = 3
                                                        Traceback (most recent call last):
                                                          File "<stdin>", line 1, in <module>
                                                        AttributeError: 'Y' object has no attribute 'c'

                                                        Также, что очевидня, свойства '__dict__' у слот-машиныобъектов ня создаётся.
                                                        Ответить
                                                        • Про это написино в книжке "Effective Python".
                                                          Вообшще полезная книжка, и спиздить её легко: она много где валяется
                                                          Ответить
                                              • Java сосёт, т.к. Oracle – злые капиталисты, С# отпадает по этой же причине. На JS я не буду писать, т.к. он для хипстеров, а С++... Не хочу его осквернять программами, которые я обычно пишу на питоне.

                                                А если серьёзно, то ты прав, да. Что угодно можно написать на крестах, там есть все инструменты для удобного питушения.

                                                Питон лично я использую только для скриптов вида «скролль эту страничку, потом сохрани её, чтобы другой скрипт распарсил её рагуляркой» и всякие сайтики.

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

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

                                                    Для меня на данный момент самый прикольный ЯП, на котором ещё и заработать можно – это С++.

                                                    На втором месте питон с его возможностями в вебдеве.
                                                    Ответить
                                                    • ну тогда .net core, он MIT

                                                      c# лишен недостатков jvm

                                                      на нем можно писать и логику, и веб)
                                                      Ответить
                                                      • Но он же от мелкомягких!

                                                        С одной стороны, мне вроде бы как нравится. С другой стороны:

                                                        Также опубликован пятый предварительный выпуск открытой платформы .NET Core 3.0, функциональность которой приближена к .NET Framework 4.8 благодаря включению в состав открытых в прошлом году компонентов Windows Forms, WPF и Entity Framework 6.

                                                        А если бы не захотели открывать, то что, лапу сосать? Такое мне не по нраву, не люблю Vendor Lock.

                                                        В принципе, кресты меня более чем устраивают, когда я пишу что-нибудь сурьёзное. Они с питоном друг друга хорошо дополняют :)
                                                        Ответить
                                                        • так не используй winforms, WPF и EF:)

                                                          Кресты это отлично, но для написания логики это немного экстрим. Впрочем, ничего суперстрашного в том тоже нет
                                                          Ответить
                                                    • Какую же хуйню я раньше писал. Пиздец.
                                                      Ответить
                                                      • Вроде бы всего 5 месяцев назад было!
                                                        Что же произошло? Не такой большой промежуток времени, чтобы всё осознать (или я слишком стар стал, и у меня мало что меняется).
                                                        Ответить
                                                  • >> openjdk же есть

                                                    Тут вообще багор. Раньше «JRE» и «JDK» можно было просто так скачать. Теперь там нужно указывать е-мейл, чтобы получить ссылку для скачивания. Если е-мейл принадлежит организации, «Оракл» её завалит письмами с предложениями купить «JRE».

                                                    Ну или можно скачать «OpenJDK» без регистрации, о чём не все знают.
                                                    Ответить
                                                    • укажи [email protected]
                                                      Ответить
                                                    • > указывать е-мейл

                                                      Ну дык, энтерпрайзный продукт...

                                                      В конце-концов, конечный юзер обычно получает джаву вместе с дистрибутивом софта на ней.
                                                      Ответить
                                                      • Важно, что лицензия внезапно поменялась:
                                                        https://blog.joda.org/2018/09/do-not-fall-into-oracles-java-11-trap.html
                                                        Ответить
                                                        • > лицензия внезапно поменялась

                                                          Эм, разве JDK/JRE не с рождения были сраным проприетарным нешвабодным говном? Что там так неожиданно могло поменяться?
                                                          Ответить
                                                          • Тогда что означает «trap» в конь-тексте данной статьи?
                                                            Ответить
                                                            • > joda

                                                              - надо читать не trap, а part
                                                              Ответить
                                                            • > что означает «trap» в конь-тексте данной статьи

                                                              Фиг знает, где они там ловушку нашли... Oracle даже предупреждение перед загрузкой показывает и предлагает купить полную версию или юзать OpenJDK.
                                                              Ответить
                                      • Ванишд
                                        Ответить
                                • честно говоря, кортеж без именованных полей особо ничем не лучше
                                  Ответить
                                  • кстати, в питоне есть еще и named tuples: кортеж с именованными полями
                                    Ответить
                            • > это типа заебись

                              Вполне. Этот мультиразврат обычно юзают в каких-то технических моментах в духе итераторов (key, value) или обработки ошибок (result, error).
                              Ответить
              • да, в луа заебись
                и без ненужной сущности
                Ответить

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