遇到以下代码时,我正在读一口流利的python书
RX
由于这本书是在f弦之前介绍的,所以我认为我可以进行以下替换
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} />'
这将在新行上返回每个字符。而不是所需的输出: if content:
return '\n'.join(f'<{name}{attr_str}>{[c for c in content]}<{name}>')
这里是否需要%格式化程序?可以使用列表理解来实现此输出吗?
答案 0 :(得分:3)
代替
'<%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 )