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

    −119

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    import inspect
    
    def phpformat(fmt):
        return fmt.format(**inspect.getouterframes(inspect.currentframe())[1][0].f_locals)
    
    surname = "Бонд"
    name = "Джеймс"
    num = 7
    print(phpformat("{surname}. {name} {surname}. Агент {num:03d}."))

    PHP'шная интерполяция строк теперь и в питоне.

    Родилось в http://govnokod.ru/18147#comment285697

    Запостил: bormand, 11 Мая 2015

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

    • http://ideone.com/6xBwt6
      Ответить
    • Не проще ли "{surname}".format(locals())?
      Ответить
      • Почитай тред по ссылке, format(**locals()) народу не понравилось - "лишний хвост".
        Ответить
    • Лол, как до такого дошел? Оно без косяков работать будет?

      Это не толкьо пхп, это еще и руби, перл
      Ответить
      • > Лол, как до такого дошел?
        Мне в треде по ссылке втирали, что в php всё удобно и ничего по 2 раза писать не надо. Вот и написал этот костыль, чтобы и в питоне не надо было.

        > Оно без косяков работать будет?
        Кто знает, кто знает... Всё-таки рефлексия. На каких-нибудь реализациях питона может и не взлететь. Ну и этот костыль дофига лишней работы делает - передаёт все локалки format'у, хотя большая часть нахрен не нужна.
        Ответить
        • Я про изъябства с inspect

          >Ну и этот костыль дофига лишней работы делает - передаёт все локалки format'у,
          Ссылки каши не просят.
          Ответить
          • > изъябства с inspect
            Да тупо загуглил как покопаться в питоньем стеке.

            > Ссылки каши не просят.
            Зато построение dict'а с этим ссылками - ещё как просит. locals() вроде как дорогая функция.
            Ответить
            • >Зато построение dict'а с этим ссылками - ещё как просит.
              По сравнению с подстановкой их в строку?

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

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

                  >Только с ними и работает. А остальные тупо не видит.
                  А-а, а я уже подумал ты сделал полноценный резолв.
                  Ответить
                  • Ну для полноценного добавь globals().
                    Ответить
                    • Полноценный - это проход снизу вверх по скопам.
                      Ответить
                      • Т.е. чтобы нормально работало со вложенными функциями?
                        Ответить
                        • В путхоне скопы дают модуль, классы, функции.
                          Ответить
                      • Короче там со случаями типа
                        def foo():
                            a = 42
                            def bar():
                                b = 100500
                                print(phpformat("{a} {b}\n"))
                            return bar
                        foo()()
                        вообще полная жопа не имеющая решения. Переменная a не юзается в bar(), а поэтому и не захватывается. И в locals() её уже не будет. И повлиять на это никак нельзя, кроме как поюзав переменную внутри bar().
                        Ответить
                        • def bar():
                              a = a
                              b = 100500
                              ...

                          А так?

                          А, вот почему в PHP у замыканий есть ключевое слово use, перечисляющее все используемые переменные! PHP писали на Питоне с использованием функции Борманда.
                          Ответить
                          • UnboundLocalError: local variable 'a' referenced before assignment
                            Ответить
                            • Питономозголомайка.

                              Вот почему нету resolve_var('a')? Или евала на худой конец.
                              Ответить
                              • Значит, только явно указывать у функции bar аргумент a, а потом его передавать?
                                Ответить
                                • Ну или как-то неявно передавать контекст в вызов функции.
                                  Ответить
                              • Угу. И собачек нет. И error_reporting(0). Вообще поохуевали там.
                                Ответить
                        • def bar():
                              nonlocal a
                              b = 100500
                              # ...

                          А так?

                          Алсо, с глобальными переменными тоже жопа должна быть по идее. Короче, есть только один шаблонизатор, и Расмус пророк его.
                          Ответить
                          • Во втором Питоне не работает, а третий не нужен. Но на этот случай кое-что придумали:
                            http://code.activestate.com/recipes/578965-python-2-nonlocal/
                            Ответить
                            • Спасите-помогите, модуль nonlocals.py не помог.
                              Ответить
                            • >а третий не нужен
                              Поссал на шкриптоблядь.

                              А почему и в третьем питоне не работает локальный импорт из программы? Т.е.

                              from . import хуй
                              Ответить
                              • Работает же.
                                Ответить
                                • >>> from . import asd
                                  Traceback (most recent call last):
                                    File "<stdin>", line 1, in <module>
                                  SystemError: Parent module '' not loaded, cannot perform relative import
                                  Ответить
                      • Что это за фреймы? inspect.getouterframes(inspect.currentfr ame())[1][0] Попробуй вручную пробежаться по ним.
                        Ответить
    • джеймс борманд
      Ответить
      • лизнул так лизнул
        Ответить
        • ох
          Ответить
        • лан. окей. хорошо.
          джеймс кегдан.
          Ответить
          • А сейчас плохо лизнул. Теряешь квалификацию
            Ответить
            • не беси меня
              Ответить
              • ^_^
                Ответить
                • > ^_^
                  Совсем обанимешился.

                  Доктор, мы его теряем.
                  Ответить
                  • Это нормально. (с)
                    Ответить
                  • Аригато, ваташи ва иша о хитсио то шимасен, десу ^_^
                    Ответить
                    • Кто так пишет? Через «ш» принято писать только названия айнских островов (Шикотан, Шиашкотан, Кунашир, Симушир, Парамушир). Японские же слова надо писать либо по-поливановски (через «с»), либо ближе к фонетике (через «щ»), но никак не через «ш», потому что согласный в слогах し , しゃ, しゅ, しょмягкий!
                      Ответить
    • реквестирую полную поддерку expression language а ля ${a.b(c,d).d[0]} и #{a.b.c}
      Ответить
    • Кстати, ES6:
      const surname = "Бонд", name = "Джеймс", num = 7;
      console.log(`${surname}. ${name} ${surname}. Агент 00${num}.`);
      Ответить
      • ((x,...y) => y.map((y,i) => x[i] + ++y).join('') + x[y.length]) `one is ${0}. two is ${1}. three is ${2}.`
        // "one is 1. two is 2. three is 3."
        Ответить
    • Именно поэтому я за "PHP".
      Ответить

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