Змея / Говнокод #18148 Ссылка на оригинал

0

  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 bormand, (Updated )

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

    • Почитай тред по ссылке, format(**locals()) народу не понравилось - "лишний хвост".
      Ответить
  • Лол, как до такого дошел? Оно без косяков работать будет?

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

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

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

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

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

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

                >Только с ними и работает. А остальные тупо не видит.
                А-а, а я уже подумал ты сделал полноценный резолв.
                Ответить
                    • Т.е. чтобы нормально работало со вложенными функциями?
                      Ответить
                    • Короче там со случаями типа
                      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 писали на Питоне с использованием функции Борманда.
                        Ответить
                          • Питономозголомайка.

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

                        А так?

                        Алсо, с глобальными переменными тоже жопа должна быть по идее. Короче, есть только один шаблонизатор, и Расмус пророк его.
                        Ответить
                    • Что это за фреймы? 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."
      Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8