Расширенное форматирование строки - Python - PullRequest
3 голосов
/ 12 августа 2011

вот краткий пример того, что я пытаюсь сделать

box = {
    'colour': 'Red',
    'dimensions': {
        'width': '100px',
        'height': '333px',
     }
}

print "The box is %(colour)s, wide %(dimensions.width) and high %(dimensions.height)" %box

Возможно ли это со стандартной библиотекой?

Если нет, какие библиотеки вы бы порекомендовали?

Ответы [ 6 ]

10 голосов
/ 12 августа 2011
>>> box = {
        'colour': 'Red',
        'dimensions': {
            'width': '100px',
            'height': '333px',
         }
    }
>>> print "The box is {colour}, wide {dimensions[width]} and high {dimensions[height]}".format(**box)
The box is Red, wide 100px and high 333px
3 голосов
/ 12 августа 2011

Да. Вы правильно поняли, за исключением того, что вы должны использовать {} вместо %().

2 голосов
/ 12 августа 2011

... также посмотрите строковые шаблоны , существовавшие с 2.4

Пример

>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
>>> d = dict(who='tim')
>>> Template('Give $who $100').substitute(d)
Traceback (most recent call last):
[...]
ValueError: Invalid placeholder in string: line 1, col 10
>>> Template('$who likes $what').substitute(d)
Traceback (most recent call last):
[...]
KeyError: 'what'
>>> Template('$who likes $what').safe_substitute(d)
'tim likes $what'
0 голосов
/ 31 июля 2013

В объектно-ориентированном виде вы можете использовать Box в качестве объекта, а затем переопределить методы __str__() и __unicode__() для вывода переменных, таких как ширина и цвет, в удобочитаемой строке.

Пример:

class Box():
    def __init__(self, **kwargs):
        self.dimensions = (kwargs.get('width'), kwargs.get('height'),)
        self.colour = kwargs.get('colour')

    def __str__(self):
        return 'The box is {}, wide {}, and {} height'.format(
            self.dimensions[0], self.dimensions[1], self.colour)

и вот как вы начинаете занятия:

a = Box(height='100px', width='100px', colour='Red')

и вот как вы распечатываете:

print(a)

или

myvar = str(a)

Примечание: я помещаю ширину и высоту в кортеж.

0 голосов
/ 12 августа 2011

Вот решение, которое я придумал, хотя методы str.format, вероятно, более чистые, добавьте следующую функцию и затем используйте "...format string..." % flatten(box).

def flatten(d, key=None):
    r = d.copy()
    if key is not None:
        r = dict((key+"."+k, v) for k, v in r.iteritems())
    for k, v in r.items():
        if isinstance(v, dict):
            r.update(flatten(v, k))
            del r[k]
    return r

Вот пример:

>>> flatten(box)
{'dimensions.width': '100px', 'colour': 'Red', 'dimensions.height': '333px'}
>>> print "The box is %(colour)s, wide %(dimensions.width)s and high %(dimensions.height)s" % flatten(box)
The box is Red, wide 100px and high 333px
0 голосов
/ 12 августа 2011

Да, но, к сожалению, только для Python3

http://docs.python.org/release/3.0.1/whatsnew/2.6.html#pep-3101

Редактировать:

Извините, эта функция также перенесена в Python 2:

>>> import sys
>>> print 'Platform: {0.platform}\nPython version: {0.version}'.format(sys)
Platform: linux2
Python version: 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
[GCC 4.5.2]
...