1

callable()オブジェクトの属性の一部はタイプ<class 'method-wrapper'>です。callable がタイプであるかどうかを確認することは可能method-wrapperですか?

たとえば、そのisinstance(object, methodwrapper)ようなものですか?


基本的に私が達成しようとしているのはこれです:私はa型のオブジェクトを持っていて、Aそれをシリアライズしてネットワーク経由で送信できるようにしたいのです。また、そのオブジェクトのメソッドを「シリアル化」したいと考えています。a特に、メソッドが変更または更新された可能性があるため、各メソッドのソースをネットワーク経由で送信して、反対側のスコープで実行し、再作成に注入できるようにしたい.すべてのメソッドを調べて、一度に 1 つずつ「シリアル化」し、ネットワークattribute_name -> attribute経由で json ディクショナリを送信します。しかし、 type のメソッドをシリアライズしようとはしませんmethod-wrapper。1 つの方法は、シリアル化しようとするときに例外をキャッチしようとすることmethod-wrappersですが、別の方法があるかどうか疑問に思っていました。

4

3 に答える 3

3

それは可能であり、推奨されません。

'method-wrapper'は実装タイプであり、cPython に固有のものです。

Python 2.7.5+ (default, Sep 19 2013, 13:49:51) 
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> object().__str__
<method-wrapper '__str__' of object object at 0xb74dd4d0>
>>> type(object().__str__)
<type 'method-wrapper'>

わかりましたが...

Python 2.7.3 (2.0.2+dfsg-4, Jun 28 2013, 11:25:07)
[PyPy 2.0.2 with GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
And now for something completely different: ``"that's however just engineering"
(fijal)''
>>>> object().__str__
<bound method object.__str__ of <object object at 0xb6bd29e8>>
>>>> type(object().__str__)
<type 'method'>

したがって、この種の型チェックがいかに良くないアイデアであるかを強調するために、いくつかのサンプル コードを示します。

class T(object):
    def __init__(self, val):
        self.val = val
    def thing(self):
        pass

そして、私はcPythonで次のことをしています:

>>> isinstance(T(1).thing,type(object().__str__))
False

そして今、pypyで:

>>>> isinstance(T(1).thing,type(object().__str__))
True

そう。達成しようとしていることの詳細を教えていただければ、それが役立つかもしれません。それ以外の場合は、上記の注意事項を残します。

于 2013-11-11T07:35:03.193 に答える
1

少なくとも、あなたはstr(type(a.foo)) == '<class 'method-wrapper'>何かをすることができます。そのように印刷されるメソッドを見つける保証された方法がある場合は、methodwrapper = a.foo.__class__それを実行できるようにすることもできるはずですisinstance(foo, methodwrapper)。ただし、これらを直接公開するモジュールがある可能性がありますがbuiltins、私が見ることができるわけではありません。他にどこを見るべきかわかりません。

編集:

>>> type(all.__call__)
<type 'method-wrapper'>
于 2013-11-11T07:23:59.380 に答える