了解装饰器中kwargs args的这种特定用法

时间:2018-08-06 03:02:02

标签: python decorator args kwargs

这是python中随机游走仿真的一部分。

谁能解释为什么装饰器的“长度”定义为:

length=kwargs["n"] if "n" in kwargs else args[-1]

特别是:

首先,我相信装饰器print_info(func)必须返回在random_generator(n)和walk_generator(num_steps,n)函数中使用的参数“ n”。正确吗?

第二,我不明白为什么我们要使用“字典”类型(** kwargs)。在这种情况下,walk_generator函数不是(5,2)元组吗?

第三,如果需要使用** kwargs,请向我解释上面的行(“长度”的定义方式)。

谢谢:)

import random

def print_info(func):

    def wrapper_func(*args, **kwargs):

        length=kwargs["n"] if "n" in kwargs else args[-1]
        print("iterator (length=%d) object is created."%length)

        return func(*args, **kwargs)
    return wrapper_func


@print_info
def random_generator(n):
    for i in range(n):
        yield -2*random.randint(0,1)+1

@print_info
def walk_generator(num_steps, n):
    for i in range(n):
        yield random_generator(num_steps)


if __name__=="__main__":
    walk_gen=walk_generator(5,2)
    for rand_gen in walk_gen:
        print("new random walk begins")
        position=0
        for step in rand_gen:
            position+=step
            print("\t position: %d (%d)"%(position, step))

0 个答案:

没有答案