获取当前函数的内置变量

Built-in variable to get current function

我有很多像下面这样的函数,它们根据参数的类型递归调用自己来获得一个或多个returns:

def get_data_sensor(self, sensorname):
    if isinstance(sensorname, list):
        return [get_data_sensor(self, sensor) for sensor in sensorname]
    return get_data(os.path.join(self.get_info("path"), "{0}.npy".format(sensorname)))

我想递归调用我的函数而不必知道我当前的函数名称,我不想在代码中使用我的函数名称两次以限制复制粘贴错误。

Determine function name from within that function (without using traceback) 显示了如何获取实际的函数名称,但我需要函数本身来调用它。

您可以使用 装饰器 完全在函数外部抽象出该逻辑(如果您不熟悉装饰器,请参阅 this thorough answer):

from functools import wraps

def autolist(func):
    @wraps(func)
    def wrapper(args):
        if isinstance(args, list):
            return [func(arg) for arg in args]
        return func(args)
    return wrapper

这个装饰器可以应用于任何需要模式的函数,现在只需要实现标量情况:

>>> @autolist
... def square(x):
...     return x ** 2
...
>>> square(1)
1
>>> square([1, 2, 3])
[1, 4, 9]

如果您将其应用于 方法,正如 self 所暗示的,您还需要在 wrapper.例如,如果相关参数始终是 last 你可以这样做:

def autolist(func):
    @wraps(func)
    def wrapper(*args):
        *args, last_arg = args
        if isinstance(last_arg, list):
            return [func(*args, arg) for arg in last_arg]
        return func(*args, last_arg)
    return wrapper

这也适用于方法:

>>> class Squarer:
...     @autolist
...     def square(self, x):
...             return x ** 2
...
>>> Squarer().square(1)
1
>>> Squarer().square([1, 2, 3])
[1, 4, 9]