Discuss / Python / 先把例子敲一敲

先把例子敲一敲

Topic source

Resalee

#1 Created at ... [Delete] [Delete and Lock User]

例子1:

def log(func):
    def wrapper(*args, **kw):
        print(f'call {func.__name__}():')
        return func(*args, **kw)
    return wrapper

# now=log(now) 同名变量now = log(now函数),返回wrapper函数
@log
def now():
    print('2019-07-16')

# log(now)(), log(now)返回wrapper,执行wrapper(),先打印,然后返回now() (这里是执行原函数now)
now()

例子2:

import functools

def log(text):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print(f'{text} {func.__name__}():')
            return func(*args, **kw)
        return wrapper
    return decorator

# now = log('execute')(now)
@log('execute')
def now():
    print('2019-07-16')
    print(now.__name__)

now()

作业1:

Python time sleep() 函数推迟调用线程的运行,可通过参数secs指秒数,表示进程挂起的时间。

Python time time() 返回当前时间的时间戳(1970纪元后经过的浮点秒数)。

Resalee

#2 Created at ... [Delete] [Delete and Lock User]

作业1:

Python time sleep() 函数推迟调用线程的运行,可通过参数secs指秒数,表示进程挂起的时间。

Python time time() 返回当前时间的时间戳(1970纪元后经过的浮点秒数)。

def metric(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kw):
        t1 = time.time()
        result = fn(*args, **kw)
        t2 = time.time()
        print(f'{fn.__name__} executed in: {(t2-t1)*1000} ms')
        return result
    return wrapper

作业2:

参考了前面童鞋的作业,主要是要判断传进来的参数是否可调用,也就是callable(),

如果可以调用,说明是传的函数,比如@log的形式,即log(now),那么就返回decorator(text),即decorator(now),此时等于原文中的第一个例子;

如果传的字符串,那么就直接返回decorator,等同于原文中的第二个例子

import functools

def log(text="call"):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            if isinstance(text, str):
                print(f'begin {text} {func.__name__}():')
            else:
                print(f'begin call {func.__name__}():')
            result = func(*args, **kw)
            print('end call\n')
            return result
        return wrapper

    if not callable(text):
        return decorator

    return decorator(text)

# now = log(now)
@log
def now():
    print('2019-07-16')

# log(now)()-->decorator(now)()-->wrapper()
# 这里text是now函数
now()


# 等同于 @log('call')
# now1 = log('call)(now1)
@log()
def now1():
    print('2019-07-17')

now1()

# then = log('execute')(then)
@log('execute')
def then():
    print('2019-07-18')

# log('execute')(then)()-->decorator(then)()-->wrapper()
then()

  • 1

Reply