Python中嵌入变量的字符串

Python中嵌入变量的字符串,python,string,variables,string-formatting,Python,String,Variables,String Formatting,也许有些人已经问过这个问题,但我没有找到它,我想知道如何在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}') 在Python中有什么方法可以像我在Ruby中所做的那样吗?从Python 3.6开始,您可以使用aka f-strings,它

也许有些人已经问过这个问题,但我没有找到它,我想知道如何在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}')

在Python中有什么方法可以像我在Ruby中所做的那样吗?

从Python 3.6开始,您可以使用aka f-strings,它在{…}花括号内接受任何有效的Python表达式,然后是可选的格式说明:

print(f'Hi, my name is {name} and my age is {age:d}')
这里的name和age都是简单的表达式,用于生成该名称的值

在Python 3.6之前的版本中,您可以使用、搭配或:

正如您所看到的,格式与Ruby非常接近。locals和globals方法将名称空间作为字典返回,而**关键字参数splash语法使str.format调用能够访问给定名称空间中的所有名称

演示:

但是请注意,显式优于隐式,您应该将名称和年龄作为参数传入:

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))
或使用位置参数:

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))
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())
您还可以使用:

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'

实际上这看起来更复杂,我在找一些简单的东西。@AndresOrozco我从来没有说过这更简单,我只是想提供一个与ruby模板语法匹配的替代方案。是的,但我要求的是一些简单的东西,比如ruby。@AndresOrozco是你问题的简短答案,更明确地说,python是否提供自动字符串插值?答案是否定的,没有办法做到这一点。您可以使用str.format,使用%名称,但必须始终显式传递要插值的对象。进行自动字符串插值的唯一方法是破解函数的字节码以自动插入对str.format的调用,但您可能无法保证它在大多数情况下都能正常工作。