从定位参数到仅限关键字参数
作者:互联网
从定位参数到仅限关键字参数
Python最好的特性之一是提供了极为灵活的参数处理机制,而且Python3进一步提供了仅限关键字参数(keyword-only argument)。与之密切相关的是,调用函数时使用*和**展开可迭代对象,映射到单个参数
# tag函数用于生成HTML标签;使用名为cls的关键字参数传入’class'属性,这是一种变通方法,因为‘class’是Python的关键字
def tag(name, *content, cls=None, **attrs):
'''生成一个或多个HTML标签'''
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 '<%s%s />' % (name, attr_str)
tag('br') # 传入特定名称,生成一个指定名称的空标签
'<br />'
tag('p', 'hello') # 第一个参数后面的任意个参数会被*content捕获,存入一个元组
'<p>hello</p> '
print(tag('p', 'hello', 'world'))
<p>hello</p>
<p>world</p>
tag('p', 'hello', id=12) # tag函数签名中没有明确指定名称的关键字参数会被**attrs捕获,存入一个字典
'<pid="12">hello</p> '
print(tag('p', 'hello', 'world', cls='sidebar')) # cls参数只能作为关键字参数传入
<pclass="sidebar">hello</p>
<pclass="sidebar">world</p>
tag(content='testing', name='img') # 调用tag函数时,即使第一个定位参数也能作为关键字参数传入
'<imgcontent="testing" />'
my_tag = {'name': 'img', 'title': 'Sunset Boulevard', 'src': 'suset.jpg', 'cls': 'framed'}
tag(**my_tag) # 在my_tag前面加上**,字典中的所有元素作为单个参数传入,同名键会绑定到对应的具名参数上,余下的责备**attrs捕获
'<imgclass="framed"src="suset.jpg"title="Sunset Boulevard" />'
仅限关键字参数是Python3新增的特性。前面的cls参数只能通过关键字参数指定,它一定不会捕获未命名的定位参数。定义函数时若想指定仅限关键字参数,要把它们放到前面有的参数后面。如果不想支持数量不定的定位参数,但是想支持仅限关键字参数,在签名中放一个
def f(a, *, b):
return a, b
f(1, b=2)
(1, 2)
仅限关键字参数不一定要有默认值,可以像上面的b那样,强制必须传入实参
标签:仅限,关键字,tag,参数,attrs,hello,cls 来源: https://www.cnblogs.com/Reion/p/15704546.html