Python: 使用变量名占位符格式化字符串

14

考虑以下字符串构建语句:

s="svn cp %s/%s/ %s/%s/" % (root_dir, trunk, root_dir, tag)

使用四个 %s 可能会令人困惑,因此我更喜欢使用变量名:

s="svn cp {root_dir}/{trunk}/ {root_dir}/{tag}/".format(**SOME_DICTIONARY)

root_dirtagtrunk在类的范围内被定义,并且使用self.__dict__时,效果很好:

s="svn cp {root_dir}/{trunk}/ {root_dir}/{tag}/".format(**self.__dict__)

但是当变量为本地变量时,它们不会被定义在一个字典中,因此我使用字符串拼接代替:

s="svn cp "+root_dir+"/"+trunk+"/ "+root_dir+"/"+tag+"/"

我发现这个方法相当令人困惑,但我不知道有什么方法可以使用内联局部变量来构建字符串。

当变量是局部变量时,如何使用变量名构造字符串?

更新:使用locals()函数解决了问题。

请注意,允许混合使用局部变量和对象变量!例如:

s="svn cp {self.root_dir}/{trunk}/ {self.root_dir}/{tag}/".format(**locals())
3个回答

27
你可以使用 locals() 函数。
s="svn cp {root_dir}/{trunk}/{root_dir}/{tag}/".format(**locals())

编辑:

从Python 3.6开始,您可以使用字符串内插:

s = f"svn cp {root_dir}/{trunk}/{root_dir}/{tag}/"

1
谢谢,我完全忘记了 locals() - Adam Matan
请注意,'{a}'.format(**locals())、'{a}'.format(a=a) 和 '{0}'.format(a) 的时间分别为 450ns、410ns 和 215ns。 - comte
请注意,字符串插值(非常棒,并且适用于绝大多数情况)会立即格式化;在某些情况下(例如模板字符串参数),您可能希望稍后在初始字符串赋值之后调用“format”方法。 - user2561747

2

你尝试过这个吗? s="svn cp {root_dir}/{trunk}/ {root_dir}/{tag}/".format(**locals())


0

更易懂且更快速

"my name is {__name__}".format_map(locals())
str.format_map(mapping) 类似于str.format(**mapping),但直接使用映射,而不是复制到字典中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接