【发布时间】:2015-03-26 22:40:21
【问题描述】:
我正在尝试从导入的包中对 SomeClass 上的方法进行猴子补丁:
from somepackage import SomeClass
def newmethod(obj, node, **kwargs):
""" """
SomeClass.oldmethod = newmethod
其中obj 和node 在SomeClass.oldmethod 的默认调用签名中:
class SomeClass(object):
def oldmethod(obj, node):
""" """
我知道猴子补丁不是一个好的做法,但我们需要一种解决方法,同时解决一些无法解决的问题。上述方法工作正常,但我们想使用部分函数来做到这一点。例如:
from functools import partial
newmethod_a = partial(newmethod, foo='a')
newmethod_b = partial(newmethod, foo='b')
偏函数被调用是因为我们需要传递不同的 **kwargs。但是当我现在尝试超载时:
SomeClass.oldmethod = newmethod_a
我收到与传递的参数数量有关的错误,但它对我的问题非常具体,因此粘贴它可能没有帮助...我认为该错误与 oldmethod 的调用签名有关,采用两个位置参数(obj, node),并且我的部分函数没有正确传递对obj 和node 的引用。我尝试过不同的结构,例如:
newmethod_a = partial(SomeClass.newmethod, foo='a')
很抱歉,我无法制作一个最小的工作示例。我希望也许专家会从经验中认识到这个问题,并告诉我我正在尝试的内容是否可能在partial 的范围内。
谢谢
【问题讨论】:
-
请至少说明您遇到的错误的文本,然后@Philips 的回答是否指向正确的方向,或者还有其他问题,您会很清楚。可能性是无穷无尽的......
-
你的问题确实是functools.partial on class method的重复;我现在让你支付赏金。
-
我4个月前问过这个问题,我真的没有环境来测试解决方案了。提供的答案似乎不错。虽然我没有提出赏金
-
@MartijnPieters 这是我的赏金。我没有在 classmethod 问题上找到 functools.partial,但它看起来也很相关。
-
@MartijnPieters 另外,有趣的是,这个问题实际上比那个问题更早,尽管直到今天它还没有任何答案!
标签: python partials monkeypatching