如何在Python中获取函数的名称

Python是一种在IT行业中广泛使用的编程语言。在本文中,我们将学习如何在Python中获取函数的名称。 函数对象的__name__属性 在Python中,函数对象具有一个特殊的属性__name

Python是一种在IT行业中广泛使用的编程语言。在本文中,我们将学习如何在Python中获取函数的名称。

函数对象的__name__属性

在Python中,函数对象具有一个特殊的属性__name__,可以用来获取函数的名称。例如:

now.__name__   'now'
f.__name__   'now'

使用装饰器增强函数功能

假设我们想要增强一个函数的功能,比如在函数调用前后自动打印日志,但又不希望修改函数的定义。这种在代码运行期间动态增加功能的方式被称为“装饰器”(Decorator)。

装饰器是一个返回函数的高阶函数。我们可以定义一个能够打印日志的装饰器,如下所示:

def log(func):
    def wrapper(*args, kw):
        print('call %s():' % func.__name__)
        return func(*args, kw)
    return wrapper

使用装饰器

通过Python的@语法,我们可以将装饰器放置在函数的定义处:

@log
def now():
    print('2013-12-25')

调用now()函数时,不仅会执行now()函数本身,还会在函数调用前打印一行日志:

now()

装饰器的原理

将@log放置在now()函数的定义处,相当于执行了语句:

now  log(now)

由于log()是一个装饰器,它返回一个函数。因此,原来的now()函数仍然存在,只是现在同名的now变量指向了新的函数。因此,调用now()将执行新函数,即在log()函数中返回的wrapper()函数。

接收参数的装饰器

如果装饰器本身需要传入参数,那就需要编写一个返回装饰器的高阶函数。下面是一个自定义log文本的例子:

def log(text):
    def decorator(func):
        def wrapper(*args, kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, kw)
        return wrapper
    return decorator

注意:调试代码时,需要将调试代码注释掉。

标签: