Я большой поклонник использования словарей для форматирования строк. Это помогает мне читать формат строки, который я использую, а также позволяет мне использовать существующие словари. Например:
class MyClass:
def __init__(self):
self.title = 'Title'
a = MyClass()
print 'The title is %(title)s' % a.__dict__
path = '/path/to/a/file'
print 'You put your file here: %(path)s' % locals()
Однако я не могу понять синтаксис Python 3.x для того же (или, если это вообще возможно). Я хотел бы сделать следующее
# Fails, KeyError 'latitude'
geopoint = {'latitude':41.123,'longitude':71.091}
print '{latitude} {longitude}'.format(geopoint)
# Succeeds
print '{latitude} {longitude}'.format(latitude=41.123,longitude=71.091)
python
string
dictionary
python-3.x
Доран
источник
источник
Это хорошо для тебя?
источник
format_map
. Аналогичноstr.format(**mapping)
, за исключением того, чтоmapping
используется напрямую и не копируется вdict
. Это полезно, если, напримерmapping
, подкласс dictprint(**geopoint)
такой же , какprint(longitude=71.091, latitude=41.123)
. Во многих языках это называется оператором сплат . В JavaScript это называется оператором распространения . В python нет конкретного имени, данного этому оператору.Чтобы распаковать словарь в аргументы ключевого слова, используйте
**
. Кроме того, форматирование нового стиля поддерживает ссылки на атрибуты объектов и элементов отображений:источник
'{0[latitude]} {1[latitude]} {0[longitude]} {1[longitude]}'.format(geopoint0, geopoint1)
defaultdict
и у вас нет всех ключейПоскольку Python 3.0 и 3.1 являются EOL'ами, и никто не использует их, вы можете и должны использовать
str.format_map(mapping)
(Python 3.2+):Это означает, что вы можете использовать, например,
defaultdict
, которая установит (и вернет) значение по умолчанию для отсутствующих ключей:Даже если предоставленное отображение - это
dict
не подкласс, это, вероятно, все равно будет немного быстрее.Разница не большая, хотя, учитывая
затем
примерно на 10 нс (2%) быстрее, чем
на моем Python 3.4.3. Разница, вероятно, будет больше, поскольку в словаре больше ключей, и
Обратите внимание, что язык форматирования гораздо более гибкий, чем этот; они могут содержать индексированные выражения, доступ к атрибутам и т. д., поэтому вы можете отформатировать целый объект или 2 из них:
Начиная с версии 3.6, вы также можете использовать интерполированные строки:
Вам просто нужно помнить, чтобы использовать другие символы кавычек во вложенных кавычках. Другим преимуществом этого подхода является то, что он намного быстрее, чем вызов метода форматирования.
источник
format
? (Учитывая, что это не копируется в диктовку)'%(latitude)s %(longitude)s'%geopoint
;)источник
Синтаксис Python 2 работает и в Python 3:
источник
f""
или"".format()
;)источник
print('%(latitude)s %(longitude)s'%geopoint)
это также значительно быстрее, чем другие 2'%(geopoint["latitude"])s %(geopoint["longitude"])s'%{"geopoint":geopoint}
В большинстве ответов форматируются только значения из dict.
Если вы также хотите отформатировать ключ в строку, вы можете использовать dict.items () :
Вывод:
Если вы хотите выполнить произвольное форматирование, то есть не показывать значения ключей, такие как кортежи:
Вывод:
источник
geopoint.items()
;)