1. 程式人生 > 其它 >從定位引數到僅限關鍵字引數

從定位引數到僅限關鍵字引數

從定位引數到僅限關鍵字引數

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那樣,強制必須傳入實參