获取当前函数的内置变量
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]
我有很多像下面这样的函数,它们根据参数的类型递归调用自己来获得一个或多个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]