Вопрос по string, python – функция «.format» в python

5

Недавно я нашел''.format Функция очень полезна, потому что она может улучшить читаемость по сравнению с% форматирование. Попытка добиться простого форматирования строки:

data = {'year':2012, 'month':'april', 'location': 'q2dm1'}

year = 2012
month = 'april'
location = 'q2dm1'
a = "year: {year}, month: {month}, location: {location}"
print a.format(data)
print a.format(year=year, month=month, location=location)
print a.format(year, month, location)

Хотя два первых отпечатка форматируются так, как я ожидал (да,something=something выглядит ужасно, но это только пример), последний подниметKeyError: 'year'. Is there any trick in python to create dictionary so it will automatically fill keys and values, for example somefunc(year, month, location) будет выводить{'year':year, 'month': month, 'location': location}?

Я довольно новичок в Python и не смог найти никакой информации по этой теме, однако такой трюк улучшил бы и значительно сократил мой текущий код.

Заранее спасибо и простите мой английский.

Ваш Ответ

4   ответа
1

Вы можете использоватьdict() вызываемая:

dict(year=yeah, month=month, location=location)

При передаче аргументов ключевого слова создается dict, содержащий элементы, которые вы указали как kwargs.

Если вы не хотите указывать имена аргументов, используйте позиционный стиль.format():

>>> a = 'year {0} month {1} location {2}'
>>> print a.format(2012, 'april', 'abcd')
year 2012 month april location abcd

Однако, если вы попытаетесь сделать что-то похожее на то, чтоcompact() in PHP делает (создайте имя переменной в соответствии со своими значениями без указания имени и переменной отдельно), пожалуйста, не делайте. Это просто приводит к ужасному нечитаемому коду и в любом случае потребует неприятных хаков.

Кроме того, просто добавив,dict это не функция.dict это тип.
Спасибо, это близко к тому, что мне нужно, однако с 10-12 аргументами становится довольно трудно ориентироваться в индексах. duke_nukem
Ну, в этом случае вы должны использовать синтаксис dict. Однако, в зависимости от того, что вы хотите сделать, подумайте об использовании реального механизма шаблонов, такого какjinja2.
Да, я знаю о dict (), но я пытаюсь избежать ненужного кода и немного уменьшить его. Кстати, .format может принять ваш вариант без dict (). Спасибо. duke_nukem
Спасибо за направление шаблона. duke_nukem
6

Первыйprint должно быть

print a.format(**data)

Кроме того, если вы найдете несколько ярлыков, вы можете написать такой, как, без большой разницы.

def trans(year, month, location):
    return dict(year=year, month=month, location=location)
Кажется, нет способа уменьшить этот повторяющийся код :) Функция хороша, и это было то, что я и сделал, на самом деле, но позже мне было трудно это поддерживать, потому что с большим количеством аргументов мне нужно было изменить код в нескольких местах, что оказалось быть даже хуже, чем создавать диктат руками. duke_nukem
@duke_nukem да, это зависит от вашего фактического использования. Код в порядке, и формат API достаточно ясно. Если вы чего-то добиться, какformat(*args, **kwargs), это также может быть сделано, но я не думаю, что это могло бы облегчить ситуацию.
1

Вы могли бы пройтиlocals():

a.format(**locals())

Конечно, у этого есть проблемы: вам придется передавать все локально, и может быть трудно понять эффект переименования или удаления переменной.

Лучший способ был бы:

a.format(**{k:v for k,v in locals() if k in ('year', 'month')})
# or; note that if you move the lambda expression elsewhere, you will get a different result
a.format(**(lambda ld = locals(): {k:ld[k] for k in ('year', 'month')})())

Но это не является более кратким, если вы не заключаете его в функцию (которая, конечно, должна принимать параметр dict).

3
data = {'year':2012, 'month':'april', 'location': 'q2dm1'}
a = "year: {year}, month: {month}, location: {location}"

print a.format(**data)

... это то, что вы ищете. Это функционально идентично действию.format(year=data['year'], ...)или другие примеры, которые вы привели.

Элемент с двойной звездочкой трудно найти, поэтому его обычно называют "kwargs". Вот этохороший так вопрос по этому синтаксису

Похожие вопросы