变量插值
问题描述:
在PHP中一个可以写:
$fruit = 'Pear';
print("Hey, $fruit!");
但是在Python是:
fruit = 'Pear'
print("Hey, {0}!".format(fruit))
有没有办法让我在字符串中插入变量?如果不是,这是如何pythonic更?
的人谁得到的参考加分
答
你现在正在做它的方式是做它pythonic的方法。您也可以使用locals字典。像这样:
>>> fruit = 'Pear'
>>> print("Hey, {fruit}".format(**locals()))
Hey, Pear
现在看起来不是很pythonic,但它是实现您在PHP格式化中具有相同效果的唯一方法。我只是坚持你做这件事的方式。
答
像这样的东西应该工作:
"%(fruit)s" % locals()
答
你可以得到的PHP行为最接近的是,仍然保持你的Python禅是:
print "Hey", fruit, "!"
打印将在每一个逗号插入空格。
较常见的Python的成语是:
print "Hey %s!" % fruit
如果你有一大堆的参数,并希望他们的名字,你可以使用的字典:
print "Hey %(crowd)s! Would you like some %(fruit)s?" % { 'crowd': 'World', 'fruit': 'Pear' }
答
从NamespaceFormatter例如略有调整在PEP-3101:
import string
class NamespaceFormatter(string.Formatter):
def __init__(self, namespace={}):
super(NamespaceFormatter, self).__init__()
self.namespace = namespace
def get_value(self, key, args, kwds):
if isinstance(key, str):
try:
# Check explicitly passed arguments first
return kwds[key]
except KeyError:
return self.namespace[key]
else:
super(NamespaceFormatter, self).get_value(key, args, kwds)
fmt = NamespaceFormatter(globals())
fruit = 'Pear'
print fmt.format('Hey, {fruit}!')
为:
Hey, Pear!
答
不要这样做。这是unpythonic。例如,当您将翻译添加到应用程序时,除非您自己检查所有翻译文件,否则无法再控制使用哪些变量。
举个例子,如果你改变了一个局部变量,你也必须在所有的翻译字符串中改变它。
是啊,你*可以* - 但当你在它,如何切换到“新”字符串格式? '%'-formatting将被删除有一天... – delnan 2010-08-22 18:29:29
这看起来比我做的方式更糟 – Aillyn 2010-08-22 18:33:46
使用'locals()'是非常糟糕的风格,永远不要这样做。改为将想要放入字符串的实际值传递给该字符串。 – Allen 2012-02-10 21:04:57