【问题标题】:How to define Python functions inside a loop and use *args and **kwargs如何在循环中定义 Python 函数并使用 *args 和 **kwargs
【发布时间】:2020-07-22 21:08:03
【问题描述】:

我正在尝试在调用实例方法时打印一条消息,如下所示。我遇到了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

【问题讨论】:

  • 我会猜测你是在寻找装饰师,同时考虑到你之前的问题。
  • @roganjosh 再次嗨 :) 是的,这个问题是切线相关的......我正在编写一个辅助函数,它将在 DataFrame 上打印 dunder 方法的名称,因为它们被调用,所以我可以尝试弄清楚是否有一个在每次更新时都会被调用,然后我可以覆盖。如果我无法弄清楚,我可以尝试再问一次
  • :) 我想你会很挣扎。您的建议(在我的脑海中)是您希望在不创建 API 的情况下随心所欲地使用这些东西。标记到 every 方法 - 如果您不尝试控制某些东西,为什么要记录它?
  • @roganjosh 是的,如果我正在编写自己的类,我会使用装饰器,但现在我只是想修补 DataFrame 的方法,以便它告诉我修改时运行的 dunder 方法它。然后我可以修改那些 dunder 方法以在修改时打印一条通知用户的语句。我知道所有这些猴子补丁看起来都很脏,但如果你对我的第一个问题有其他解决方案,我欢迎!
  • groupby 怎么样?那是 Cython 代码,很常见 - 这甚至叫你可以追踪的 dunder 吗?

标签: python closures args keyword-argument late-binding


【解决方案1】:

这会有帮助吗?添加一个具有默认值的关键字参数,以便提前绑定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__(...)

【讨论】:

    猜你喜欢
    • 2020-09-16
    • 2017-01-28
    • 2023-04-01
    • 2023-03-19
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    相关资源
    最近更新 更多