【发布时间】:2015-02-05 23:16:30
【问题描述】:
我正在尝试修补 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
WhereORIGINAL_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 实例。如何使用 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。
是的,我知道这是不好的做法,但这只是暂时的解决方法。
【问题讨论】:
标签: python pandas partials monkeypatching functools