デコレータのデコレータのようなものに頼らないで、関数に適用されたデコレータのリストを取得する方法はありますか?関数に適用されたデコレータのリストを取得できますか?
答えて
まず、すべてのデコレータがラッパー関数を返すわけではないので、デコレータは単に既存の関数を変更するだけです(おそらく属性を設定します)。Pythonはどのような関数にすべての属性が当てはまるのかを記録しません。第二に、ガーベジコレクタに、装飾された関数への参照を保持するクロージャと、クロージャを持つ関数に問い合わせることはおそらく可能ですが、クロージャ内の別の関数への参照を保持する関数はデコレータによって適用されるラッパーではありません。引き続き議論を行うデコレータの問題があります。実際の装飾機能に到達する前に、内部関数の余分な層があります。最後に、すべてのデコレータが関数ではなく、すべての装飾オブジェクトが関数ではありません。
要するに、いくつかの時間を近似することは可能かもしれませんが、動作しても、CPythonでしか動作しない大きなハックになります。シンプルで文書化された方法はありません。
+1は私よりも想像力豊かなハッキリです。結局のところ、半機能的なソリューションでさえも、「デコレータを飾る」よりもハックになることがあります。それは、さようなら、本当にすべてがハッキングしているわけではありません。 – senderle
デコレータには、関数を置き換えたり、関数をラップしたり、必要なものを返すためのオプションがあるので、これは不可能だと思います。関数に "適用"されているわけではありません。
私は間違っていることを証明するために、何かがいつもpython標準ライブラリの深みから泡立つように見えるので、このような回答を投稿するのは不安です。しかし、私は本当に答えはノーだと確信しています。
デコレータは関数そのものに過ぎません。@foo
は、func = foo(func)
の文法的な砂糖ですから、まだあなたに与えられていない機能は何も追加していません。それほど多くはありません。
それはあなたが、func_dict
でつつくことができfunc_globals
、func_defaults
、func_closure
というように、といくつかの推測を作るかもしれないことは可能ですが、に行動を手でコーディング関与しない良い一般的な解決策があることをそうですデコレータ。あるいは、あなたが言うように、デコレータを飾ることによって。
他の答えとして、デコレータは関数をラップすることはできませんでしたが、変更するだけでした。その場合、デコレータはそれらを見つけることができませんでした。
しかし、ラッパーデコレータの場合、Pythonのデバッグフックを使うことができます。簡単ではなく、クリーンではありませんが、デバッグフックをそれぞれ呼び出す関数を入力して、装飾された関数を呼び出す - 新しい関数に入力したフックが呼び出されるたびに、それがあなたの "最終"関数かどうかを調べるためにイントロスペクションを使います(あなたのデコレータがfunctools .wrapそれ自身で、あなたの望む関数はオリジナルの__name__
属性を保持する唯一のものです。それ以外の場合はもっと厄介です) - sys.settrace
とbdb
モジュールのドキュメントを参照して、何かを考え出してください。
しかし、これを考えるとき、デコレータを飾るdoeはもうハックを見ないのですか?
- 1. パンダのデータフレームにベクトル化された関数を適用できますか?
- 2. levenshtein関数から移動リストを取得できますか?
- 3. インポートされた関数ストアドプロシージャのリストを取得する方法
- 4. メソッド/関数で使用されるクラスのリストを取得します。
- 5. Pythonデコレータで別の関数に渡されたときの変数の範囲
- 6. golangにパッケージからエクスポートされた関数のリストを取得する
- 7. Pythonの引数で動作するネストされた関数デコレータ
- 8. 引数リストのリストを取得し、各リストを特定の関数に適用する関数はありますか?
- 9. 適用関数のグループごとにテキストで変数を取得
- 10. n個の引数を取る関数が0個の引数を含むデコレータ関数のサブ関数に渡されたときにエラーメッセージがスローされる
- 11. 適用されたGradleプラグインキーの取得
- 12. デコレータからPython関数の所有クラスを取得
- 13. 関数内にネストされたリストの理解を適用する
- 14. リスト関数をitertools.groupby内のネストされたジェネレータに適用する
- 15. ユニットテストでデコレータが適用されている関数をどうやって模擬しますか?
- 16. リストを取得してソートされたリストを返す再帰関数
- 17. Python - デコレータの元の関数引数を取得
- 18. どこでサポートされているブラウザと一緒にjavascript関数のリストを取得できますか?
- 19. 引数のリストに関数のリストを適用する
- 20. haskellの再帰関数の定義内の再帰的にビルドされたリストに関数を適用する
- 21. JavaScriptのバインドされた関数からアンバウンド関数を取得できますか?
- 22. TypeScriptの属性デコレータのリストを取得します
- 23. リストの要素の出力番号 `l_dply`は関数に適用されます
- 24. ng-checked関数で渡された引数を取得できません
- 25. 最大数リストを取得リスト内にネストされた
- 26. 関数デコレータでラップされた関数の元の名前を取得する方法はありますか?私が欲しいもの
- 27. リンクされたリスト関数のヘルプ....オーバーロードされたストリームの操作と取得と設定の関数C++
- 28. マップでネストされたデータフレームに関数を適用する
- 29. 関数型プログラミング、Haskell関数を変数リストに適用する
- 30. 別の関数から返された引数のリストにSchemeの関数を適用するにはどうすればよいですか?
ここでは、この質問には多少異なる(しかし容易に適応可能な)形式でこの質問にほとんど答えました:http://stackoverflow.com/questions/5910703/howto-get-all-methods-of-a-python -class-with-given-decoratorデコレータをデコレートすることは、ソースコードのハック、C-pythonハックなどのハックアップよりも少なくなります。私の謙虚な意見では、「デコレータをデコレートする」はまったくハックしておらず、一般的なテクニックです。(また、この質問はリンクされた質問のサブセットであると考えられるかもしれません。なぜなら、メソッドは主に関数であるからですが、より多くのトリックを適用することができるからです)。 – ninjagecko