2009-06-04 3 views
4

私はinfer_class関数を実装しようとしていますが、メソッドがあれば、そのメソッドが属するクラスを把握しています。私はこれを達成する方法を考え出すことができませんでしたので、それに@ staticmethod-Sには機能しません@staticmethodが属するクラスを推論するにはどうすればよいですか?

import inspect 

def infer_class(f): 
    if inspect.ismethod(f): 
     return f.im_self if f.im_class == type else f.im_class 
    # elif ... what about staticmethod-s? 
    else: 
     raise TypeError("Can't infer the class of %r" % f) 

これまでのところ、私はこのようなものを持っています。

提案がありますか?

ここでのアクションでinfer_classです:

staticmethodsは本当に方法ではないためだ
>>> class Wolf(object): 
...  @classmethod 
...  def huff(cls, a, b, c): 
...   pass 
...  def snarl(self): 
...   pass 
...  @staticmethod 
...  def puff(k,l, m): 
...   pass 
... 
>>> print infer_class(Wolf.huff) 
<class '__main__.Wolf'> 
>>> print infer_class(Wolf().huff) 
<class '__main__.Wolf'> 
>>> print infer_class(Wolf.snarl) 
<class '__main__.Wolf'> 
>>> print infer_class(Wolf().snarl) 
<class '__main__.Wolf'> 
>>> print infer_class(Wolf.puff) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 6, in infer_class 
TypeError: Can't infer the class of <function puff at ...> 
+1

あなたがソースを持って、あなたは親クラスを読み込むことができます。なぜこれが必要ですか?あなたは何を達成しようとしていますか? –

+2

関数やメソッドを一時的にスタブする関数を書くことを考えたとします(テスト目的のために、呼び出しを傍受するなど)。これを行うには、関数を含むオブジェクトと関数名の2つの要素が必要です。つまり、 'setattr(obj、func_name、my_stub)'を実行することができます。もしfがモジュールレベルの関数なら、私は 'inspect.getmodule(f)'を使ってオブジェクトを取得し、 'f .__ name__'を使ってその名前を取得します。クラスメソッドとインスタンスメソッドについては、上記のコードを使用します。静的メソッドの場合、私は運が尽きていると思われます。 –

答えて

3

。 staticmethod記述子は、元の関数をそのまま返します。関数がアクセスされたクラスを取得する方法はありません。しかし、メソッドにstaticメソッドを使用する本当の理由はありません。常にクラスメソッドを使用してください。

私がstaticmethodsで見つけた唯一の用途は、関数オブジェクトをクラス属性として格納し、メソッドに変換しないことです。

+6

-1: "とにかくメソッドにstaticメソッドを使用する本当の理由はありません。常にclassmethodsを使用してください。"インスタンスメソッドまたはクラスメソッドを意味しますか?静的メソッドには有効なユースケースがあり、時にはそれを使用するための「本当の理由」があります。 – nikow

+2

私はstaticmethodをclassMethodのどこより優先したいですか?私が言ったように、唯一の魅力的な用途はクラス属性として関数を格納することです。 (そして、私は "しかし、私はclsパラメータが魅力的ではない"と考えている) –

+2

+1合意。 Pythonでstaticmethodを使用することは、classオブジェクトとして関数オブジェクトを格納すること以外には見られませんでした。 –

3

私はトラブルに実際に自分自身をもたらすことがありますが、これをお勧めしますが、少なくとも、簡単な例のために働くように見えるん:

import inspect 

def crack_staticmethod(sm): 
    """ 
    Returns (class, attribute name) for `sm` if `sm` is a 
    @staticmethod. 
    """ 
    mod = inspect.getmodule(sm) 
    for classname in dir(mod): 
     cls = getattr(mod, classname, None) 
     if cls is not None: 
      try: 
       ca = inspect.classify_class_attrs(cls) 
       for attribute in ca: 
        o = attribute.object 
        if isinstance(o, staticmethod) and getattr(cls, sm.__name__) == sm: 
         return (cls, sm.__name__) 
      except AttributeError: 
       pass 
+0

getattr(v、sm .__ name __、None)がsmの場合、items()、なし) – parity3

関連する問題