python - 判断函数是否嵌套在对象内

标签 python

我想编写一个可以应用于单个函数和嵌套在对象中的函数的装饰器。困难在于我希望装饰器访问对象变量(通过 self.var)或函数变量(通过 kwargs)。

我装饰单个函数的示例代码如下所示:

def outer_decorator(var_to_print):
    def inner_decorator(function):
        def wrapper(*args, **kwargs):
            if var_to_print in kwargs.keys():
                string_to_print = kwargs.get(var_to_print, "")
                print(string_to_print)
            return function(*args, **kwargs)
        return wrapper
    return inner_decorator

@outer_decorator(var_to_print='var')
def print_something(var=''):
    print('print_second')

print_something(var = 'print_first')
#print_first
#print_second

对于对象,我想做类似的事情,但不是访问 kwargs,而是访问 self.var:

        def wrapper(self, *args, **kwargs):
            string_to_print = getattr(self, var_to_print)
            print(string_to_print)
            return function(self, *args, **kwargs)

关于如何动态检查应该应用什么包装器有什么想法吗?我试图检查它是否是可调用的,但这似乎对两者都适用。

最佳答案

您可以使用 inspect 中的 isfunction模块。

Return True if the object is a Python function, which includes functions created by a lambda expression.

>>> from inspect import isfunction
>>> class A():
...     pass
... 
>>> def f():
...     pass
... 
>>> a = A()
>>> isfunction(a)
False
>>> isfunction(f)
True

实际上,您想要做的是通过为函数和方法使用相同的装饰器来区分函数和方法。方法仍然是函数。当您从类或类的实例访问它时,它被视为一种方法。
我能想到两种选择。

  1. 向装饰器添加参数@outer_decorator(var_to_print='var', f_type='method')
  2. 使用inspect.getfullargspec假设在您的类中您将使用 self 作为参数名称,而您的函数不会。示例:

    if 'self' in inspect.getfullargspec(f)[0]:
    

关于python - 判断函数是否嵌套在对象内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60000744/

相关文章:

python - 如何防止 lxml remove 方法删除两个元素之间的文本

python - `try... except Exception as e` 是否捕获所有可能的异常?

python - 如何在Python中提取特定模式

python - 如何以整数形式检索 QLabel 值

python - 在 pypy 上安装 pip

python - 从ndb python通过urlsafe key查询记录

python - 即使在 python 中提交交换函数后,列表仍然保持不变

Python struct.pack 导致内存泄漏,即使在删除对象后也是如此

python - 与freebase库相关

python - 如何覆盖 Python Dataclass 'asdict' 方法