Рубін приклад:
name = "Spongebob Squarepants"
puts "Who lives in a Pineapple under the sea? \n#{name}."
Успішне з'єднання рядків Python мені здається багатослівним.
Рубін приклад:
name = "Spongebob Squarepants"
puts "Who lives in a Pineapple under the sea? \n#{name}."
Успішне з'єднання рядків Python мені здається багатослівним.
Відповіді:
Python 3.6 додасть буквальну рядкову інтерполяцію, аналогічну інтерполяції рядка Ruby. Починаючи з тієї версії Python (яку планується випустити до кінця 2016 року), ви зможете включити вирази до "f-рядків", наприклад
name = "Spongebob Squarepants"
print(f"Who lives in a Pineapple under the sea? {name}.")
До 3.6, найближчим до цього можна дістатися
name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? %(name)s." % locals())
%
Оператор може бути використаний для інтерполяції рядків в Python. Перший операнд - це рядок, який слід інтерполювати, другий може мати різні типи, включаючи "відображення", зіставлення імен полів зі значеннями, які слід інтерполювати. Тут я використав словник локальних змінних locals()
для відображення назви поля name
до його значення як локальної змінної.
Той самий код, що використовує .format()
метод останніх версій Python, виглядатиме так:
name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? {name!s}.".format(**locals()))
Також є string.Template
клас:
tmpl = string.Template("Who lives in a Pineapple under the sea? $name.")
print(tmpl.substitute(name="Spongebob Squarepants"))
%s
для рядка та %03d
для числа, доповненого 3-ма цифрами з провідними нулями. Це можна було просто написати print "%s has %03d" % ("Python", 2)
. Потім у прикладі використовується введення ключа в картону в дужках, після %
чого це спосіб дати значущі імена заповнювачів, а не покладатися на їх порядок у рядку. Потім ви передаєте словник, який відображає назви ключових значень їх значенням. Ось чому Sven використовує locals()
функцію, яка повертає дікт, що містить усі ваші локальні змінні, тому він буде відображати name
значення імені
s
як тип перетворення - Python може конвертувати майже будь-що у рядок. Але, звичайно, ви втратите особливі можливості форматування інших типів конверсії.
Оскільки Python 2.6.X ви можете використовувати:
"my {0} string: {1}".format("cool", "Hello there!")
%
оператор для інтерполяції рядків не є застарілим у Python 3.x. docs.python.org/dev/py3k/whatsnew/… оголошує про план знецінення, %
починаючи з 3.1, але цього не сталося.
{}
мені може бути усунене.
Я розробив пакет інтерпірування , який дозволяє інтерполяцію рядків у Python .
Просто встановіть його через pip install interpy
. А потім додайте рядок # coding: interpy
на початку своїх файлів!
Приклад:
#!/usr/bin/env python
# coding: interpy
name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n#{name}."
Інтерполяція рядка Python подібна до printf C)
Якщо ви спробуєте:
name = "SpongeBob Squarepants"
print "Who lives in a Pineapple under the sea? %s" % name
Тег %s
буде замінено name
змінною. Слід поглянути на теги функцій друку: http://docs.python.org/library/functions.html
print "First is %s, second is %s" % (var1, var2)
.
Інтерполяція рядків буде включена в Python 3.6, як зазначено в PEP 498 . Ви зможете зробити це:
name = 'Spongebob Squarepants'
print(f'Who lives in a Pineapple under the sea? \n{name}')
Зауважте, що я ненавиджу Spongebob, тому писати це було трохи болісно. :)
Ви також можете це мати
name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n{name}.".format(name=name)
#
друкувати. Вони просто використовують синтаксис Ruby.
#
персонаж буде надрукований.
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)
Використання:
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: продуктивність може бути проблемою. Це корисно для локальних сценаріїв, а не для виробничих журналів.
Дублюється:
Для старого Python (тестовано на 2.4) верхнє рішення вказує шлях. Ви можете зробити це:
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()
І ви отримуєте
d: 1 f: 1.1 s: s
У Python 3.6 та новіших версіях є інтерполяція в прямому рядку за допомогою f-рядків:
name='world'
print(f"Hello {name}!")
name
, що локальна змінна лежить у рядку, і в Python ви повинні явно передати словник локальних змінних у форматник рядків, якщо ви хочете, щоб він їх використовував.