灵活的函数参数配置方法

如下代码所示,name 用于定位,content 用于将多个参数放到一个元组中,cls 作为关键词参数,attrs 用于捕获后面的参数放到一个字典中。

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 = 'xxxxxxx' # 由于 Obsidian 原因无法显示
    if content:
        return '\n'.join(xxx)
	else:
		return 'xxxxxx'
 
>>> tag('br')  ➊
'<br />'
>>> tag('p', 'hello')  ➋
'<p>hello</p>'
>>> print(tag('p', 'hello', 'world'))
<p>hello</p>
<p>world</p>
>>> tag('p', 'hello', id=33)  ➌
'<p id="33">hello</p>'
>>> print(tag('p', 'hello', 'world', cls='sidebar'))  ➍
<p class="sidebar">hello</p>
<p class="sidebar">world</p>
>>> tag(content='testing', name="img")  ➎
'<img content="testing" />'
>>> my_tag = {'name': 'img', 'title': 'Sunset Boulevard',
...           'src': 'sunset.jpg', 'cls': 'framed'}
>>> tag(**my_tag)  ➏
'<img class="framed" src="sunset.jpg" title="Sunset Boulevard" />'

如果不需要某些参数,还可以使用 * 来进行省略,如下所示:

>>> def f(a, *, b):
...     return a, b
...
>>> f(1, b=2)
(1, 2)

位置参数 & 关键字参数 & 缺省参数 & 不定长参数

# 位置参数
def printme( strr ):
   print(strr)
 
printme("hello")
 
# 关键字参数
def printinfo( name, age ):
   print("Name: ", name)
   print("Age ", age)
 
printinfo(age=50, name="miki" )
 
# 缺省参数
def printinfo( name, age = 35 ):
   print("Name: ", name)
   print("Age ", age)
 
printinfo( age=50, name="miki" )
printinfo( name="miki" )
 
# 不定长参数,当作元组
def user_info(*args):
    print(args)
 
user_info('TOM')        # ('TOM', )
user_info('TOM', 'hi')  # ('TOM', 'hi')
 
# 不定长参数,当作字典
def user_info(**kwargs):
    print(kwargs)
 
user_info(name='TOM')                 # {'name':'TOM'}
user_info(name='TOM', mess='hi')  # {'name':'TOM', 'mess':'hi')

位置参数

Effective Python:编写高质量 Python 代码的 90 个有效方法(原书第 2 版)-布雷特·斯拉特金-微信读书

第 25 条用只能以关键字指定和只能按位置传入的参数来设计清晰的参数列表