2

Pythonのoperator.methodcallerから関数名を取得することは可能ですか?

import operator as op
mc = op.methodcaller('foo')
print magic(mc) #should print 'foo'

magicmethodcallerが呼び出しているメソッドの名前を取得するにはどうすればよいですか?

4

1 に答える 1

4

ですが、Cの内部を掘り下げる必要があります(推奨される解決策ではありません)。

from ctypes import *

PyObject_HEAD = [
    ("ob_refcnt", c_size_t),
    ("ob_type", c_void_p),
]

class methodcallerobject(Structure):
    _fields_ = PyObject_HEAD + [
        ("name", c_void_p),
        ("args", c_void_p),
        ("kwds", c_void_p),
    ]

def magic(methcallobj):
    if not isinstance(methcallobj, operator.methodcaller):
        raise TypeError("not a methodcaller")

    c_methcallobj = cast(c_void_p(id(methcallobj)), POINTER(methodcallerobject)).contents

    return cast(c_methcallobj.name, py_object).value

これはCPythonでのみ機能し、特に美しくはないことに注意してください。しかし、これが利用可能な唯一の解決策である場合は、何もないよりはましです。

于 2012-08-27T11:48:15.297 に答える