4

在 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
4

6 回答 6

5

更新: 从 Python 3.6 开始,有格式化的字符串文字(f-strings)可以实现文字字符串插值:f"..{get_val()+1}..."


如果您需要的不仅仅是一个简单的字符串格式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

使用 @stringfunction 的 Python 模板

于 2012-03-18T23:39:13.620 回答
4

使用格式方法:

>>> '{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'
于 2012-03-18T23:03:43.463 回答
2

使用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应该打印变量值的位置。还有其他格式选项。请参阅方法的文档format

这将使事情几乎像在 Ruby 中一样。(唯一的区别是在 Ruby 中你必须#在大括号前加上#{get_val})。

如果您需要输出 incremented 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'
于 2012-03-18T23:02:13.340 回答
2

作为一名 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 中的工作方式相同。

于 2012-03-18T23:13:58.060 回答
2

现代 Python 中的等效程序使用 f 字符串。(f-string 语法是一个相对较新的添加。)

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()
于 2018-06-05T03:22:08.453 回答
1

Polyglot.org为 PHP、Perl、Python 和 Ruby 回答了很多类似的问题。

于 2012-03-19T00:23:28.433 回答