python关于函数调用作为参数的说明&&装饰器

Posted JonnyJiang-zh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python关于函数调用作为参数的说明&&装饰器相关的知识,希望对你有一定的参考价值。

python关于函数调用作为参数的说明&&装饰器

简单的:

先看代码:

def out():
    print(‘out‘)
    
    def inner():
        return ‘inner‘
    
    return inner()


if __name__ == ‘__main__‘:
    print(type(out()))

输出结果:

out
<class ‘str‘>

我们看到type函数的参数是out(),执行的过程就是:out() --> inner() --> type(inner()),type里的参数实际上是inner, 最后的打印结果就是<class ‘str‘>。代码通过执行out函数,得到最终的参数。若改成print(‘inner‘)结果就是None类型。

复杂的:

代码:

import time
import functools


def timing(status=‘Train‘):
    print(‘1‘)

    def dec(func):
        print(‘2‘)

        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            start = time.time()
            func1 = func(*args, **kwargs)  
            print(‘[%s] time: %.3f s ‘ % (status, time.time() - start))
            return func1

        return wrapper

    return dec


@timing(status=‘Train‘)
def Training():
    time.sleep(3)
    print(‘over‘)

if __name__ == ‘__main__‘:
    print(‘main‘)
    print(‘*‘ * 10)
    print(type(Training()))

输出结果:

1
2
main
**********
over
[Train] time: 3.000 s
<class ‘NoneType‘>

关于这段带代码,可能疑问点在于在main前面的‘1’‘1’,导致这个的原因是因为timing()函数作为装饰器时执行函数的预处理功能,先timing()函数的执行,先返回dec然后执行dec(),且Training()作为该函数的参数,即dec(Training()),然后就是wrapper()函数。此时Training = timing(dec(Training())),这就是其中的‘1’‘2’的由来,也就是预处理完毕。然后就执行main函数的代码。当执行print(type(Training()))时,就就执行wrapper(),然后就是func1 = fun() = Training() = None。因为Training()函数是打印一句话,所以说返回值为None,所以最后的结果就是None Type。

以上是关于python关于函数调用作为参数的说明&&装饰器的主要内容,如果未能解决你的问题,请参考以下文章

关于c语言中数组作为函数参数的函数之间调用问题

Python & Tkinter -> 关于调用冻结程序的长时间运行函数

python基础

python使用函数作为参数

关于python中几个函数的用法

从 C++ 调用 python 函数时如何将 C++ 类作为参数传递?