我正在尝试修补pandas
Panel 的切片 ( __getitem__
) 方式。这对于一个基本函数 foo 来说很简单。
from pandas import Panel
Panel.__getitem__ = ORIGINAL_getitem
def newgetitem(panel, *args, **kwargs):
""" Append a string to return of panel.__getitem__"""
out = super(Panel, panel).__getitem__(*args, **kwargs)
return out+'custom stuff added'
Panel.__getitem__ = newgetitem
ORIGINAL_getitem
原始 Panel 方法存储在哪里。我试图扩展到foo()
不是函数,而是对象的实例方法的情况,Foo
. 例如:
class Foo:
name = 'some name'
def newgetitem(self, panel, *args, **kwargs):
""" Append a string to return of panel.__getitem__,
but take attributes from self, like self.name
"""
out = super(Panel, panel).__getitem__(*args, **kwargs)
return out+'custom stuff added including name' + self.name
Foo.foo()
必须访问属性self.name
。因此,除了 Panel 之外,monkeypatched 函数还需要以某种方式引用 Foo 实例。我怎样才能使用monkeypatch面板Foo.foo()
并使self.name可以访问?
猴子补丁功能之间的切换发生在另一种方法中,Foo.set_backend()
class Foo:
name = 'some name'
def foo(self):
return 'bar, called by %s' % self.name
def set_backend(self, backend):
""" Swap between new or original slicing."""
if backend != 'pandas':
Panel.__getitem__ = newgetitem
else:
Panel.__getitem__ = ORIGINAL_getitem
我真正需要的是newgetitem
保持对self
.
解决方案尝试
到目前为止,我已经尝试过创建newgetitem()
一个纯函数,并使用部分函数来传递对 self 的引用。这不起作用。就像是:
import functools
def newgetitem(foo_instance, panel, *args, **kwargs):
....
class Foo:
...
def set_backend(self, backend):
""" Swap between new or original slicing."""
if backend != 'pandas':
partialfcn = functools.partial(newgetitem, self)
Panel.__getitem__ = partialfcn
else:
Panel.__getitem__ = ORIGINAL_getitem
但这不起作用。传递了对 self 的引用,但无法从调用 Panel 访问。那是:
panel['50']
传递对 的引用Foo
,而不是传递给Panel
。
是的,我知道这是不好的做法,但这只是暂时的解决方法。