從定位引數到僅限關鍵字引數
阿新 • • 發佈:2021-12-18
從定位引數到僅限關鍵字引數
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那樣,強制必須傳入實參