2012-08-03 6 views
27

W Pythonie jest nużące napisać:Czy Python ma podobną interpolację zmiennych jak "string # {var}" w Ruby?

print "foo is" + bar + '.' 

Czy mogę zrobić coś takiego w Pythonie?

print "foo is #{bar}."

+0

możliwe duplikat [format ciągów liczb w Pythonie] (http://stackoverflow.com/questions/22617/format-numbers-to-strings-in-python) –

+0

myślę znalazłeś rozwiązanie, możesz to sprawdzić? http://stackoverflow.com/questions/16504732/how-could-i-make-my-python-string-interpolation-implementation-work-accross-impo – SalchiPapa

+0

Możliwy duplikat [Czy istnieje odpowiednik Pythona dla ciągu ruby interpolacja?] (https://stackoverflow.com/questions/4450592/is-there-a-python-equivalent-to-rubys-string-interpolation) – josemigallas

Odpowiedz

38

Python nie zrobić zmiennej interpolacji - to raczej wyraźne niż niejawna.

Jednakże, można użyć str.format przekazać w zmiennych:

# Rather than this: 
puts "foo is #{bar}" 

# You would do this: 
print "foo is {}".format(bar) 

# Or this: 
print "foo is {bar}".format(bar=bar) 

# Or this: 
print "foo is %s" % (bar,) 

# Or even this: 
print "foo is %(bar)s" % {"bar": bar} 
+1

Trzeci wygląda schludnie, ale pamiętam w ten sposób trochę przestarzały? czy to prawda? – mko

+10

Istnieje również, dla leniwych, "print" foo jest% (bar) s "% locals()'. –

+1

@ yozloy - popraw to, że jest przestarzałe w Pythonie 3 (jak rozumiem). –

4

String formatting

>>> bar = 1 
>>> print "foo is {}.".format(bar) 
foo is 1. 
+3

lub starszy, ale nadal popularny: print "foo is% s"% str (bar) – Edmon

+0

To powinno być już przestarzałe, chociaż nie mogę znaleźć PEP. – Josiah

+0

Nie jest przestarzałe, tylko zastąpione. –

7

nauczyłem się następujące techniki z Python Essential Reference:

>>> bar = "baz" 
>>> print "foo is {bar}.".format(**vars()) 
foo is baz. 

Jest to bardzo przydatne, gdy chcemy odnieść się do wielu zmiennych w ciągu formatowania:

  • Nie musimy powtarzać wszystkich wersji ables na liście argumentów: porównaj to z jawnymi podejściami opartymi na argumencie słowa kluczowego (takimi jak "{x}{y}".format(x=x, y=y) i "%(x)%(y)" % {"x": x, "y": y}).
  • Nie musimy sprawdzać pojedynczo, jeśli kolejność zmiennych na liście argumentów jest zgodna z ich kolejnością w łańcuchu formatowania: porównaj to z podejściami opartymi na argumentach pozycyjnych (takimi jak "{}{}".format(x, y), "{0}{1}".format(x, y) i "%s%s" % (x, y)) .
+2

To jest ... dziwny sposób na przejście w bar ... Całkiem fajnie, sprawia, że ​​bardziej podąża za Rubinowym sposobem. – Josiah

+0

To wydaje się najlepszym rozwiązaniem, jeśli pracujesz z obiektem. Na przykład, jeśli zgłaszasz błąd urllib2.HTTPError, możesz zrobić "" Błąd HTTP: {error.code} {error.msg} ".format (** vars())' To nie działa z 'format (* * locals()) ' –

2

wolę takie podejście, ponieważ nie trzeba powtarzać się przez odwołanie do zmiennej dwukrotnie:

 
alpha = 123 
print 'The answer is {alpha}'.format(**locals()) 
+0

Ale myślę, że to bardzo powolne - rozpakowywanie możliwie dużego dicta dla params. – warvariuc

+0

@warwaruk pisanie na standardowe wyjście jest czynnikiem ograniczającym, drukowanie ciągu znaków zajmuje 10 razy więcej czasu niż formatowanie, ponadto locals() zwraca referencję, więc myślę, że ta metoda jest dość szybka – jcr

3

Istnieje duża różnica między tym w Ruby:

print "foo is #{bar}." 

I te w Pythonie:

print "foo is {bar}".format(bar=bar) 

W przykładzie Ruby bar jest oceniano
W przykładzie Pythona, bar jest właśnie klucz do słownika

W przypadku, gdy jesteś po prostu stosując zmienne zachowują się mniej więcej takie same, ale w ogóle, konwersja Ruby do Pythona ISN nie jest tak prosty

6

Python 3.6 ma introduced f-strings:

print(f"foo is {bar}.") 

Old odpowiedź:

Od wersji 3.2 Python ma str.format_map które wraz z locals() lub globals() pozwala zrobić szybko:

Python 3.3.2+ (default, Feb 28 2014, 00:52:16) 
>>> bar = "something" 
>>> print("foo is {bar}".format_map(locals())) 
foo is something 
>>> 
18

Python 3.6 będzie ma ma literal string interpolation przy użyciu f -strings:

print(f"foo is {bar}.") 
+2

W przypadku, gdyby ktoś się zastanawiał: tak, można łączyć to z surowymi łańcuchami, tak jak "rf" foo to {bar} ". –

Powiązane problemy