也许有人已经问过这个,但我没有找到它,我想知道如何在 Python 中将变量嵌入到字符串中。我通常这样做:
print('Hi, my name is %s and my age is %d' %(name, age))
但有时会令人困惑,使用 ruby 会是这样
puts('Hi, my name is #{name} and my age is #{age}')
有什么办法可以像我在 Ruby 中那样在 Python 中做吗?
也许有人已经问过这个,但我没有找到它,我想知道如何在 Python 中将变量嵌入到字符串中。我通常这样做:
print('Hi, my name is %s and my age is %d' %(name, age))
但有时会令人困惑,使用 ruby 会是这样
puts('Hi, my name is #{name} and my age is #{age}')
有什么办法可以像我在 Ruby 中那样在 Python 中做吗?
从 Python 3.6 开始,您可以使用格式化字符串文字(又名f-strings{...}
),它采用花括号内的任何有效 Python 表达式,后跟可选的格式化指令:
print(f'Hi, my name is {name} and my age is {age:d}')
这里name
和age
都是产生该名称值的简单表达式。
在 Python 3.6 之前的版本中,您可以使用, 与或str.format()
配对:locals()
globals()
print('Hi, my name is {name} and my age is {age}'.format(**locals()))
如您所见,该格式与 Ruby 的格式相当接近。locals()
and方法将globals()
命名空间作为字典返回,**
关键字参数启动语法使str.format()
调用可以访问给定命名空间中的所有名称。
演示:
>>> name = 'Martijn'
>>> age = 40
>>> print('Hi, my name is {name} and my age is {age}'.format(**locals()))
Hi, my name is Martijn and my age is 40
但是请注意,显式优于隐式,您应该真正传入name
和age
作为参数:
print('Hi, my name is {name} and my age is {age}'.format(name=name, age=age)
或使用位置参数:
print('Hi, my name is {} and my age is {}'.format(name, age))
您还可以使用:
dicta = {'hehe' : 'hihi', 'haha': 'foo'}
print 'Yo %(hehe)s %(haha)s' % dicta
另一种完全使用 Ruby 语法的格式字符串的替代方法:
import string
class RubyTemplate(string.Template):
delimiter = '#'
用作:
>>> t = RubyTemplate('Hi, my name is #{name} and my age is #{age}')
>>> name = 'John Doe'
>>> age = 42
>>> t.substitute(**locals())
'Hi, my name is John Doe and my age is 42'
然后,您可以创建一个函数,例如:
def print_template(template, vars):
print(RubyTemplate(template).substitute(**vars))
并将其用作:
>>> print_template('Hi, my name is #{name} and my age is #{age}', locals())
Hi, my name is John Doe and my age is 42
附带说明:即使是python也%
允许这种插值:
>>> 'Hi, my name is %(name)s and my age is %(age)d' % locals()
'Hi, my name is John Doe and my age is 42'
str.format
是新的方法,但这也有效:
print('Hi, my name is %(name)s and my age is %(age)d' % {
'name': name,
'age': age,
})
如果变量已经存在,这实际上与此相同:
print('Hi, my name is %(name)s and my age is %(age)d' % locals())