2010-08-22 89 views
6

可能重複:
Unpythonic way of printing variables in Python?變量插值

在PHP中一個可以寫:

$fruit = 'Pear'; 
print("Hey, $fruit!"); 

但是在Python是:

fruit = 'Pear' 
print("Hey, {0}!".format(fruit)) 

有沒有辦法讓我在字符串中插入變量?如果不是,這是如何pythonic更?

的人誰得到的參考加分

回答

4

你現在正在做它的方式是做它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

1

像這樣的東西應該工作:

"%(fruit)s" % locals() 
11

你可以得到的PHP行爲最接近的是,仍然保持你的Python禪是:

print "Hey", fruit, "!" 

打印將在每一個逗號插入空格。

較常見的Python的成語是:

print "Hey %s!" % fruit 

如果你有一大堆的參數,並希望他們的名字,你可以使用的字典:

print "Hey %(crowd)s! Would you like some %(fruit)s?" % { 'crowd': 'World', 'fruit': 'Pear' } 
1

從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! 
-1

不要這樣做。這是unpythonic。例如,當您將翻譯添加到應用程序時,除非您自己檢查所有翻譯文件,否則無法再控制使用哪些變量。

舉個例子,如果你改變了一個局部變量,你也必須在所有的翻譯字符串中改變它。