2010-08-22 39 views
6

thể trùng lặp:
Unpythonic way of printing variables in Python?suy biến bằng Python

Trong PHP người ta có thể viết:

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

Nhưng trong Python đó là:

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

Có cách nào để tôi nội suy các biến trong chuỗi thay thế không? Và nếu không, làm thế nào là điều này nhiều hơn pythonic?

điểm thưởng cho bất cứ ai được tham chiếu

Trả lời

4

Cách bạn đang làm nó bây giờ là một cách pythonic để làm điều đó. Bạn cũng có thể sử dụng từ điển locals. Giống như vậy:

>>> fruit = 'Pear' 
>>> print("Hey, {fruit}".format(**locals())) 
Hey, Pear 

Hiện tại, nó không phải là rất nhiệt tình, nhưng đó là cách duy nhất để đạt được ảnh hưởng tương tự như bạn có trong định dạng PHP. Tôi chỉ dính vào cách bạn đang làm nó.

+2

Vâng, bạn * có thể * - nhưng trong khi bạn đang ở đó, làm cách nào để chuyển sang định dạng chuỗi "mới"? '%'-format sẽ được loại bỏ một số ngày ... – delnan

+0

Điều này thậm chí còn tồi tệ hơn cách tôi đang làm nó – Aillyn

+2

Đó là phong cách cực kỳ xấu để sử dụng 'người dân địa phương()', không bao giờ làm điều này. Vượt qua giá trị thực tế bạn muốn đặt vào chuỗi thay thế. – Allen

1

Something như thế này nên làm việc:

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

Gần nhất bạn có thể tới hành vi PHP là và vẫn duy trì Python-zen của bạn là:

print "Hey", fruit, "!" 

in sẽ chèn dấu cách ở mọi dấu phẩy.

Các Python thành ngữ phổ biến hơn là:

print "Hey %s!" % fruit 

Nếu bạn có tấn của các đối số và muốn đặt tên chúng, bạn có thể sử dụng một dict:

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

Một thích ứng nhẹ từ ví dụ NamespaceFormatter trong 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}!') 

cho:

Hey, Pear! 
-1

Đừng làm điều đó. Nó không độc. Ví dụ: khi bạn thêm bản dịch vào ứng dụng của mình, bạn không còn có thể kiểm soát biến nào được sử dụng trừ khi bạn tự kiểm tra tất cả các tệp bản dịch.

Ví dụ: nếu bạn thay đổi biến cục bộ, bạn sẽ phải thay đổi biến đó trong tất cả các chuỗi đã dịch.

Các vấn đề liên quan