Какие преимущества дает% formatter по сравнению с f строками? - PullRequest
0 голосов
/ 29 июня 2019

Я просматривал беглую книгу по питону, когда наткнулся на следующий код

def tag(name, *content, cls=None, **attrs):
    """Generate one or more HTML tags"""
    if cls is not None:
        attrs['class'] = cls
    if attrs:
        attr_str = ''.join(' %s="%s"' % (attr, value)
    for attr, value
        in sorted(attrs.items()))
    else:
        attr_str = ''
    if content:
        return '\n'.join('<%s%s>%s</%s>' %
                         (name, attr_str, c, name) for c in content)
    else:
        return f'<{name}{attr_str} />'

Поскольку эта книга была представлена ​​до появления f-строк, я подумал, что смогу сделать следующую замену

    if content:
        return '\n'.join(f'<{name}{attr_str}>{[c for c in content]}<{name}>') 

Возвращает каждый символ на новой строке. Вместо желаемого результата: '<p>hello</p>'

Нужен ли здесь% форматер? Может ли этот результат быть достигнут с использованием понимания списка?

1 Ответ

3 голосов
/ 29 июня 2019

Вместо

'<%s%s>%s</%s>' % (name, attr_str, c, name)

вы можете использовать

f'<{name}{attr_str}>{c}</{name}>'

, так что в итоге у вас будет генератор

f'<{name}{attr_str}>{c}<{name}>' for c in content

вместо

'<%s%s>%s</%s>' % (name, attr_str, c, name) for c in content

и

return '\n'.join( f'<{name}{attr_str}>{c}<{name}>' for c in content )

Вы также можете использовать [] для создания списка и использовать print(), чтобы увидеть все созданные элементы, прежде чем он их использует в join()

data = [ f'<{name}{attr_str}>{c}<{name}>' for c in content ]
print(data)
return "\n".join( data )
...