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}."
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}."
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}
Trzeci wygląda schludnie, ale pamiętam w ten sposób trochę przestarzały? czy to prawda? – mko
Istnieje również, dla leniwych, "print" foo jest% (bar) s "% locals()'. –
@ yozloy - popraw to, że jest przestarzałe w Pythonie 3 (jak rozumiem). –
Tak, absolutnie. Python, moim zdaniem, ma świetne wsparcie dla formatowania napisów, zamienników i operatorów.
To może być pomocne:
http://docs.python.org/library/stdtypes.html#string-formatting-operations
>>> bar = 1
>>> print "foo is {}.".format(bar)
foo is 1.
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:
"{x}{y}".format(x=x, y=y)
i "%(x)%(y)" % {"x": x, "y": y}
)."{}{}".format(x, y)
, "{0}{1}".format(x, y)
i "%s%s" % (x, y)
) .To jest ... dziwny sposób na przejście w bar ... Całkiem fajnie, sprawia, że bardziej podąża za Rubinowym sposobem. – Josiah
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()) ' –
wolę takie podejście, ponieważ nie trzeba powtarzać się przez odwołanie do zmiennej dwukrotnie:
alpha = 123 print 'The answer is {alpha}'.format(**locals())
Ale myślę, że to bardzo powolne - rozpakowywanie możliwie dużego dicta dla params. – warvariuc
@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
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
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
>>>
Python 3.6 będzie ma ma literal string interpolation przy użyciu f -strings:
print(f"foo is {bar}.")
W przypadku, gdyby ktoś się zastanawiał: tak, można łączyć to z surowymi łańcuchami, tak jak "rf" foo to {bar} ". –
możliwe duplikat [format ciągów liczb w Pythonie] (http://stackoverflow.com/questions/22617/format-numbers-to-strings-in-python) –
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
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