与 f 字符串相比,% 格式化程序有什么好处?

What benefits does the % formatter offer in comparison to f strings?

当我遇到以下代码时,我正在阅读流利的 python 这本书

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-strings 之前介绍的,我认为我可以进行以下替换

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

这returns每个字符换行。而不是期望的输出:'<p>hello</p>'

这里需要%格式化程序吗?可以使用列表理解来实现此输出吗?

而不是

'<%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 )