2017-09-28 15 views
1

呼び出し元関数に関する関数のデコレータ内から情報を取得したいと考えています。つまり、呼び出し元関数がジェネレータであるかどうかを知りたい。外側のスタックフレームの検査を試みていましたが、私はそれを行う方法を見つけることができませんでしたPython呼び出し元関数がジェネレータであるかどうかを調べる

def decorator(func): 
    @functools.wraps(func) 
    def wrapper(*args, **kwargs): 
     inspect.isgeneratorfunction(func) ### THIS WORKS 
     frame = inspect.currentframe().f_back 
     ### HERE THE MAGIC 

    return wrapper 

可能でしょうか?それとも簡単な方法がありますか?

+0

これで何をしようとしていますか?なぜあなたのことを知る必要がありますか? –

+0

いくつかの単語があります:関数の呼び出し方法に応じてデコレータの動作を変更しようとしています – akasi

答えて

1
generator = bool(frame.f_code.co_flags&32) 

少なくとも私のバージョンのpython3のように、ジェネレータは小数点記号フレームにフラグ32を設定しています。 あなたは可搬性がどのように、しかしおそらくcpythonで合理的に移植可能であるかを確認して見たいでしょう。

+0

CPython 2.7.6で動作しません –

+0

実際にCPython 2.7.6でエラーが発生しました。 .. –

+0

うわー、ありがとう!それは私が探していたものです。しかし、これを実現するためのよりよい方法があるかどうか疑問に思っています。なぜなら、このフラグはかなり暗く見えるからです。 – akasi

関連する問題