2013-07-04 47 views
7

考虑以下字符串建筑的语句格式的字符串:的Python:使用变量名占位符

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_dir,tagtrunk被定义在一个类的范围内时,使用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()) 

回答

16

可以使用locals()功能

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

编辑:

因为Python 3.6,你可以使用string interpolation

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

谢谢,完全忘了'locals()'。 –

+0

请注意,格式(a)的格式(** locals()),'{a}'。格式(a = a)和格式(a)分别在450ns,410和215时间。 (确定是ns ...) – comte

1

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