Что является эквивалентом Python для встраивания выражения в строку? (т. е. "# {expr}" в Ruby) - PullRequest
4 голосов
/ 19 марта 2012

В Python я хотел бы создать строковый блок со встроенными выражениями.
В Ruby код выглядит следующим образом:

def get_val
  100
end

def testcode
s=<<EOS

This is a sample string that references a variable whose value is: #{get_val}
Incrementing the value: #{get_val + 1}

EOS
  puts s
end

testcode

Ответы [ 6 ]

4 голосов
/ 19 марта 2012

Если вам нужно нечто большее, чем простое форматирование строки, предоставляемое str.format() и %, тогда для вставки можно использовать модуль templetВыражения Python:

from templet import stringfunction

def get_val():
    return 100

@stringfunction
def testcode(get_val):
    """
    This is a sample string
    that references a function whose value is: ${ get_val() }
    Incrementing the value: ${ get_val() + 1 }
    """

print(testcode(get_val))

Вывод

This is a sample string
that references a function whose value is: 100
Incrementing the value: 101

Шаблоны Python с @ stringfunction .

3 голосов
/ 19 марта 2012

Использование метода форматирования:

>>> '{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'
>>> '{}, {}, {}'.format('a', 'b', 'c')  # 2.7+ only
'a, b, c'
>>> '{2}, {1}, {0}'.format('a', 'b', 'c')
'c, b, a'
>>> '{2}, {1}, {0}'.format(*'abc')      # unpacking argument sequence
'c, b, a'
>>> '{0}{1}{0}'.format('abra', 'cad')   # arguments' indices can be repeated
'abracadabra'

Формат по имени:

>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'
>>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}
>>> 'Coordinates: {latitude}, {longitude}'.format(**coord)
'Coordinates: 37.24N, -115.81W'
2 голосов
/ 19 марта 2012

Polyglot.org отвечает на множество вопросов, подобных этим, для PHP, Perl, Python и Ruby.

2 голосов
/ 19 марта 2012

Как программист на C и Ruby, мне нравится классический printf -подобный подход:

>>> x = 3
>>> 'Sample: %d' % (x + 1)
'Sample: 4'

Или в случае нескольких аргументов:

>>> 'Object %(obj)s lives at 0x%(addr)08x' % dict(obj=repr(x), addr=id(x))
'Object 3 lives at 0x0122c788'

Я уже чувствую, как люди будут избивать меня за это. Тем не менее, я нахожу это особенно хорошим, потому что в Ruby он работает так же.

2 голосов
/ 19 марта 2012

Использование format метод:

>>> get_val = 999
>>> 'This is the string containing the value of get_val which is {get_val}'.format(**locals())
'This is the string containing the value of get_val which is 999'

**locals передает словарь локальных переменных в качестве аргументов ключевого слова.{get_val} в строке обозначает место, где должно быть напечатано значение переменной get_val.Есть и другие варианты форматирования.См. Метод docs из format.

Это сделает вещи почти такими же, как в Ruby.(с той лишь разницей, что в Ruby вы должны поставить # перед фигурными скобками #{get_val}).

Если вам нужно вывести увеличенное значение get_val, я не вижу другого способа напечатать его, кромеследующее:

>>> 'This is the string containing the value of get_val+1 which is {get_val_incremented}'.format(get_val_incremented = get_val + 1,**locals())
'This is the string containing the value of get_val+1 which is 1000'
1 голос
/ 05 июня 2018

Эквивалентная программа в современном Python использует f-строки.(Синтаксис f-строки является относительно недавним добавлением .)

def get_val():
    return 100

def testcode():
    s = f"""

This is a sample string that references a variable whose value is: {get_val()}
Incrementing the value: {get_val() + 1}

"""
    print(s)

testcode()
...