装饰器 *arg **args

用 * 收集位置参数

In [91]: def print_args(*args):
    ...:     print('传入的位置参数会包含在一个元组里:',args)
    ...:
# 情景 1
In [92]: print_args(22,'192.168.1.10','yangge')
传入的位置参数会包含在一个元组里: (22, '192.168.1.10', 'yangge')

# 情景 2
In [93]: li = [22,'192.168.1.10','yangge']

In [94]: print_args(li)
传入的位置参数会包含在一个元组里: ([22, '192.168.1.10', 'yangge'],)
# 上面的这种方式是,每个实参对象作为元组的一个元素    
    
# 玩点儿花活
In [95]: print_args(*li)
传入的位置参数会包含在一个元组里: (22, '192.168.1.10', 'yangge')
    
In [102]: print_args(*'abc')
传入的位置参数会包含在一个元组里: ('a', 'b', 'c')
# 这也就是传说总元组解包的原理
# 把一个可迭代对象中的每个元素作为元组的每一个元素

用 ** 收集关键字参数

def print_kwargs(**kwargs):
    print("接收的关键字参数,会是一个字典:", kwargs)
print_kwargs(name='yangge')
接收的关键字参数,会是一个字典: {'name': 'yangge'}

In [105]: print_kwargs(ip='192.168.1.10', port=22)
接收的关键字参数,会是一个字典: {'ip': '192.168.1.10', 'port': 22}
    
# 同样可以玩点儿花活
In [106]: dic = {'ip': '192.168.1.10', 'port': 22}

In [107]: print_kwargs(**dic)
接收的关键字参数,会是一个字典: {'ip': '192.168.1.10', 'port': 22}

装饰器

def outer(f):
    def inner(*arg):
        print("haha")
        f()
        print(arg)
        print("haha")
    return inner
@outer
def echo(*arg):
    print("gg")
arg=[1,2,3]
echo(*arg)
def outer(f):
    def inner(*arg,**args):
        print("haha")
        f()
        print(arg,'and',args)
        print("haha")
    return inner
@outer
def echo(*arg,**args):
    print("gg")
arg="helloworld"
echo(*arg,ip='192.168.1.10', port=22)