其他分享
首页 > 其他分享> > 从定位参数到仅限关键字参数

从定位参数到仅限关键字参数

作者:互联网

从定位参数到仅限关键字参数

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