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

    −102

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    class NumFactory:
        def __init__(self, n):
            self.val = n
        def timesTwo(self):
            self.val *= 2
        def plusTwo(self):
            self.val += 2
    
    f = NumFactory(2)
    for m in dir(f):
        mthd = getattr(f,m)
        if callable(mthd):
            mthd()
    
    print f.val

    Забавный пример. Что будет в результате выполнения?
    * 2
    * 4
    * 6
    * 8
    * исключение

    Запостил: orion, 25 Мая 2015

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

    • больше примеров тут
      http://www.mypythonquiz.com
      Ответить
    • > Что будет в результате выполнения?
      Я, как сишник, сказал бы, что UB. Разве dir гарантирует какой-то определённый порядок?

      Ну и вообще самая идея вызывать всё подряд какая-то упоротая... Этот код же и __init__ вызовет (и все методы object'а, если они там есть?), а там параметров не хватит.

      P.S. Про object я нагнал, ибо по print f.val это явно второй питон и олд-стайл класс унаследованный от нихуя.
      Ответить
      • Лол, ушлый сишник. dir вроде бы вызывает __dict__.keys(), порядок которых по определению не определен, простите за тавтологию.
        Ответить
        • Как оказалось, dir(obj) возвращает что-то типа sorted(list(obj.__dir__())). Т.е. порядок там всё-таки есть.

          https://github.com/python/cpython/blob/master/Objects/object.c#L1335
          Ответить
          • Это документировано? Нет - UB.
            Ответить
            • С сишкой позанимался? :) Раньше, помнится, ты говорил "в питоне не принято документировать очевидные вещи".
              Ответить
              • До поры до времени и "хороший код в комментариях не нуждается ".
                Ответить
              • Где я это говорил? Я вроде бы всегда был мнения, что если использовать вещи по назначению - жизнь становится проще. Был же фикс к досу через хеш коллизии, после него куча такого кода полететь должна была (например, все доктесты, выводящие дикт)
                Ответить
            • У питона тоже дохуя компиляторов/интерпретаторов?
              Ответить
              • Да.
                Ответить
                • Там же какая-то реализация для примера была, из которой требуется тащить в свою всё говно? Или это, чтоб посмотреть и сказать "ну ладно, я был не прав, эту фичу реализовать можно, не буду лениться"?
                  Ответить
                  • Да так же есть стандарт и каждый дрочит как хочет. FREE же
                    Ответить
                  • Не распарсил.
                    Ответить
                    • В предыдущем комментарии на суд аудитории представлялись следующие утверждения:
                      1. Есть реализация питона (назовём её X), на которую могут опираться те, кто создают свою.
                      1.1. Если в X есть странные моменты, не описанные в стандарте питона, то их требуется реализовать у себя (например, сортировку того, что по стандарту не должно быть отсортировано).
                      2. X создана лишь для того, чтобы показать возможности программиста.
                      2.1. Если в X есть некоторая фича Y, которую программист считает сложнореализуемой или предполагает её нереализуемость, то программист, смотря на реализацию Y, понимает, что Y вполне реализуема.
                      Автор комментария надеялся пополнить свою коллекцию фактов о питоне, получив комментарии насчёт правдивости этих утверждений.
                      Ответить
              • Скажем так, некоторые вещи могут поменяться в будущем. И да, есть (jython/ironpython)
                Ответить

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