变量插值

问题描述:

可能重复:
Unpythonic way of printing variables in Python?变量插值

在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格式化中具有相同效果的唯一方法。我只是坚持你做这件事的方式。

+2

是啊,你*可以* - 但当你在它,如何切换到“新”字符串格式? '%'-formatting将被删除有一天... – delnan 2010-08-22 18:29:29

+0

这看起来比我做的方式更糟 – Aillyn 2010-08-22 18:33:46

+2

使用'locals()'是非常糟糕的风格,永远不要这样做。改为将想要放入字符串的实际值传递给该字符串。 – Allen 2012-02-10 21:04:57

像这样的东西应该工作:

"%(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。例如,当您将翻译添加到应用程序时,除非您自己检查所有翻译文件,否则无法再控制使用哪些变量。

举个例子,如果你改变了一个局部变量,你也必须在所有的翻译字符串中改变它。