如何在循环内定义 Python 函数并使用 *args 和 **kwargs

How to define Python functions inside a loop and use *args and **kwargs

我正在尝试在调用实例方法时打印一条消息,如下所示。我 运行 变成了 this problem,但在我的案例中我无法解决它,因为所有解决方案似乎都需要传递我无法在此处执行的特定参数。

class MathLab:
    def add(self, a, b):
        print(a + b)

    def mult(self, a, b):
        print(a * b)


m = MathLab()

for method in [m.add, m.mult]:
    def tracked_method(*args, **kwargs):
        print("Running: " + method.__name__)
        method(*args, **kwargs)


    m.__setattr__(method.__name__, tracked_method)

m.add(5, 5)

输出

Running: mult
25

这有帮助吗?添加具有默认值的关键字参数,以便对 method 进行早期绑定(然后使用该关键字参数 _method 代替函数内的 method)。

为方便起见显示了整个代码,但与问题中的代码唯一不同的部分是 tracked_method 函数本身。

class MathLab:
    def add(self, a, b):
        print(a + b)

    def mult(self, a, b):
        print(a * b)


m = MathLab()

for method in [m.add, m.mult]:
    def tracked_method(*args, _method=method, **kwargs):
        print("Running: " + _method.__name__)
        _method(*args, **kwargs)


    m.__setattr__(method.__name__, tracked_method)

m.add(5, 5)

给出:

Running: add
10

顺便说一句,您可以简单地使用 setattr(m, ...).

而不是使用 m.__setattr__(...)