Rubinowy przykład:
name = "Spongebob Squarepants"
puts "Who lives in a Pineapple under the sea? \n#{name}."
Udana konkatenacja ciągów w języku Python jest dla mnie pozornie gadatliwa.
Rubinowy przykład:
name = "Spongebob Squarepants"
puts "Who lives in a Pineapple under the sea? \n#{name}."
Udana konkatenacja ciągów w języku Python jest dla mnie pozornie gadatliwa.
Odpowiedzi:
Python 3.6 doda dosłowną interpolację łańcuchów podobną do interpolacji łańcuchów Ruby. Począwszy od tej wersji Pythona (która ma zostać wydana do końca 2016 r.), Będziesz mógł dołączyć wyrażenia do „f-string”, np.
name = "Spongebob Squarepants"
print(f"Who lives in a Pineapple under the sea? {name}.")
Przed wersją 3.6 najbliżej tego można się dostać
name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? %(name)s." % locals())
%
Operator może być używany do interpolacji smyczkowy w Pythonie. Pierwszy argument jest ciągiem, który ma być interpolowany, drugi może mieć różne typy, w tym „mapowanie”, odwzorowywanie nazw pól na wartości, które mają być interpolowane. Tutaj użyłem słownika zmiennych lokalnych locals()
do mapowania nazwy pola name
na jego wartość jako zmiennej lokalnej.
Ten sam kod przy użyciu .format()
metody najnowszych wersji Pythona wyglądałby następująco:
name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? {name!s}.".format(**locals()))
Jest też string.Template
klasa:
tmpl = string.Template("Who lives in a Pineapple under the sea? $name.")
print(tmpl.substitute(name="Spongebob Squarepants"))
%s
łańcucha i %03d
liczby dopełnianej do 3 cyfr z zerami wiodącymi. Można to po prostu napisać print "%s has %03d" % ("Python", 2)
. W przykładzie wykorzystano następnie umieszczenie klucza nawiasowego w nawiasach, po %
którym można nadać symbolom zastępczym znaczące nazwy, a nie polegać na ich kolejności w ciągu. Następnie przekazujesz słownik, który mapuje nazwy kluczy na ich wartości. Właśnie dlatego Sven korzysta z locals()
funkcji, która zwraca dykt zawierający wszystkie zmienne lokalne, dzięki czemu będzie name
s
jako typu konwersji - Python może konwertować prawie wszystko na ciąg. Ale oczywiście straciłbyś specjalne możliwości formatowania innych typów konwersji.
Od wersji Python 2.6.X możesz użyć:
"my {0} string: {1}".format("cool", "Hello there!")
%
operator interpolacji łańcuchów nie jest przestarzały w Pythonie 3.x. docs.python.org/dev/py3k/whatsnew/… ogłasza plan wycofania się %
z wersji 3.1, ale tak się nigdy nie stało.
{}
można wyeliminować.
Opracowałem pakiet interpy , który umożliwia interpolację łańcuchów w Pythonie .
Wystarczy zainstalować za pośrednictwem pip install interpy
. A następnie dodaj linię # coding: interpy
na początku swoich plików!
Przykład:
#!/usr/bin/env python
# coding: interpy
name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n#{name}."
Interpolacja ciągów znaków w Pythonie jest podobna do printf () C
Jeśli spróbujesz:
name = "SpongeBob Squarepants"
print "Who lives in a Pineapple under the sea? %s" % name
Tag %s
zostanie zastąpiony name
zmienną. Powinieneś spojrzeć na tagi funkcji drukowania: http://docs.python.org/library/functions.html
print "First is %s, second is %s" % (var1, var2)
.
Interpolacja ciągów zostanie uwzględniona w Pythonie 3.6, jak określono w PEP 498 . Będziesz mógł to zrobić:
name = 'Spongebob Squarepants'
print(f'Who lives in a Pineapple under the sea? \n{name}')
Zauważ, że nienawidzę Spongeboba, więc napisanie tego było nieco bolesne. :)
Możesz też to mieć
name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n{name}.".format(name=name)
#
je wydrukować. Po prostu używają składni Ruby.
#
postać zostanie wydrukowana.
import inspect
def s(template, **kwargs):
"Usage: s(string, **locals())"
if not kwargs:
frame = inspect.currentframe()
try:
kwargs = frame.f_back.f_locals
finally:
del frame
if not kwargs:
kwargs = globals()
return template.format(**kwargs)
Stosowanie:
a = 123
s('{a}', locals()) # print '123'
s('{a}') # it is equal to the above statement: print '123'
s('{b}') # raise an KeyError: b variable not found
PS: wydajność może stanowić problem. Jest to przydatne w przypadku skryptów lokalnych, a nie dzienników produkcyjnych.
Powielone:
W przypadku starego Pythona (testowanego w wersji 2.4) najlepsze rozwiązanie wskazuje drogę. Możesz to zrobić:
import string
def try_interp():
d = 1
f = 1.1
s = "s"
print string.Template("d: $d f: $f s: $s").substitute(**locals())
try_interp()
I dostajesz
d: 1 f: 1.1 s: s
Python 3.6 i nowsze mają interpolację ciągów literalnych za pomocą f-stringów:
name='world'
print(f"Hello {name}!")
name
zmienna lokalna leży w ciągu, aw Pythonie musisz jawnie przekazać słownik zmiennych lokalnych do formatera ciągu, jeśli chcesz, aby z nich korzystał.