【问题标题】:Built-in variable to get current function获取当前函数的内置变量
【发布时间】:2021-06-21 09:40:07
【问题描述】:

我有很多类似下面的函数,根据参数的类型递归地调用自己来获得一个或多个返回:

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) 展示了如何获取实际的函数名,但我需要函数本身来调用它。

【问题讨论】:

  • 这真的是一个需要解决的问题……吗?
  • 你是如何使用sys._getframe的?还考虑到递归调用是在函数本身内部定义的,这是什么时候出现的问题?
  • 如果你说你有这么多的复制粘贴代码,你应该重新考虑你到底在做什么,也许改写一个通用的高阶函数。
  • 是的,你可以用装饰器简单地抽象它;函数本身只需要包含处理标量情况(字符串)的代码,装饰器将通过使用字符串(标量)调用包装函数一次或为列表中的每个项目(向量)调用一次包装函数来处理这两种情况.如果您不熟悉装饰器,请参阅stackoverflow.com/a/1594484/3001761
  • 我还建议阅读meta.stackexchange.com/q/66377/248731 - 在这种情况下,您提供的用于说明您正在努力解决的解决方案的示例与您试图解决的实际问题几乎没有关系。

标签: python recursion built-in


【解决方案1】:

您可以通过使用 装饰器 完全在函数外部抽象该逻辑(如果您不熟悉装饰器,请参阅 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 中考虑该参数。例如,如果相关参数始终是最后一个,您可以这样做:

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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-23
    • 2018-09-02
    • 2011-12-12
    • 2016-01-14
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多