问题
In Python, I'd like to create a string block with embedded expressions.
In Ruby, the code looks like this:
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
回答1:
If you need more than just a simple string formatting provided by str.format() and % then templet module could be used to insert Python expressions:
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))
Output
This is a sample string
that references a function whose value is: 100
Incrementing the value: 101
Python Templating with @stringfunction.
回答2:
Using the format method:
>>> '{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'
Format by name:
>>> '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'
回答3:
As a C and Ruby programmer, I like the classic printf
-like approach:
>>> x = 3
>>> 'Sample: %d' % (x + 1)
'Sample: 4'
Or in the case of multiple arguments:
>>> 'Object %(obj)s lives at 0x%(addr)08x' % dict(obj=repr(x), addr=id(x))
'Object 3 lives at 0x0122c788'
I can already feel how people are gonna beat me up for this. However, I find this especially nice because it works the same way in Ruby.
回答4:
Use format method:
>>> 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
passes a dictionary of local variables as keyword arguments.
{get_val}
in the string denotes the place where the variable's get_val
value should be printed. There are other formatting options. See the docs of format
method.
This would make the things almost as in Ruby. (with the only difference that in Ruby you have to put #
befor the curly brackets #{get_val}
).
If you need to output incremented get_val
, I see no other way to print it apart from the following:
>>> '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'
回答5:
Polyglot.org answers a lot of questions like these for PHP, Perl, Python and Ruby.
回答6:
The equivalent program in modern Python uses f-strings. (The f-string syntax is a relatively recent addition.)
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()
来源:https://stackoverflow.com/questions/9763069/what-is-the-python-equivalent-of-embedding-an-expression-in-a-string-ie-ex