関数/メソッドを調べてデコレータとして使用できるかどうかを確認することはできますか?それは、デコレータが他の関数をラップし、呼び出し可能なものを返す通常の方法に従いますか?具体的には、私はサードパーティのコードを検証するために探しています。メソッドがデコレータであるかどうかはどのように確認できますか?
答えて
、その後、結果は__call__
メソッドが含まれているかどうかをテストし、あなたが与えられた呼び出し可能がデコレータであるかないかどうかについての推測を作り出すことができます。しかし、それは単なる推測であり保証ではありません。
それ以外にも、Python言語の動的な型付けと、CPythonインタープリタの組み込み関数の特別な扱いのために、あなたが望むものは一般的には可能ではないと私は信じています。呼び出し可能オブジェクトが引数として別の呼び出し可能オブジェクトを受け入れるかどうか、またはその戻り値の型をプログラムで指定することはできません。また、CPythonでは、Cで実装された関数の場合、呼び出し可能な引数を調べて、受け入れる引数の数を確認することさえできません。
「デコレータ」という単語は、異なるものを意味すると解釈できます。それを定義する1つの方法は、デコレータは、単一の(呼び出し可能な)引数を受け取り、呼び出し可能なものを返す呼び出し可能なものです。
この定義では「関数」という単語を使用していないことにも注意してください。実際にそうするのは間違いでしょう。
- ビルトイン
classmethod
とstaticmethod
デコレータ返す記述子オブジェクトではなく、機能:確かに、いくつかの一般的に使用されるデコレータは奇妙な性質を持っています。 - 言語バージョン2.6以降では、関数やメソッドだけでなく、クラスを修飾することができます。
__init__(self, somecallable)
メソッドと__call__(self, *args, **kwargs)
メソッドを含む任意のクラスをデコレータとして使用できます。
ありがとうございます - デコレータは "[呼び出し可能な引数を1つだけ受け入れて呼び出し可能なものを返す"]ことができるというステートメントは、私のテストの基礎になります。第三者コードで作成する必要があります。しかし、複雑さから判断すると、代わりに素晴らしいエラーメッセージを提供しようとしています。 :D –
私はこのようなことは一度もしていませんが、一般的に、このような状況では、「ダックタイピング」に依存しています。だから、ダミー関数を装飾し、呼び出し可能なものが返されたかどうかを調べることができます。
Pythonに標準化されたデコレータがないので、あなたが探しているデコレータについて何か分かっていない限り、関数がデコレータかどうかを伝える本当の方法はありません。
デコレータがあなたのコントロール下にある場合、装飾機能であることを示すマークを付けることができます。さもなければ、これを行う本当の統一された方法はありません。例えば、この例を取る:
def decorator(func):
return g
@decorator
def f()
pass
def g():
pass
を上記の例では、実行時に、fおよびgは、同一となり、離れた2を伝える方法はありません。
これは不可能です。 f
がデコレータであるかどうかを調べる代わりに、あなたはそれをチェックする必要があると思うべきですか?
あなたには、いくつかの特定のデコレータを期待している場合は、直接あなたには、いくつかの特定の動作/メソッドをしたい場合は/あなたには、いくつかの呼び出し可能f
がデコレータとして使用することができるかどうかを確認したい場合は、
は、このような素朴なチェックです:
def decorator1(func):
def _wrapper(*args, **kwargs):
print "before"
func(*args, **kwargs)
print "after"
return _wrapper
def dummy_func(): pass
out_func = decorator1(dummy_func)
if callable(out_func) and dummy_func != out_func:
print "aha decorated!"
'ダミー関数を渡して直接確認できますか?? '実際には...あなたはそれがその議論と何をするのかを教えてはいけません! – katrielalex
@katrielalexはい一般的な答えはいいえですが、デコレータが何をすべきか知っていれば、それを使って振る舞いを確認することができます –
引数の正しい数を持つ任意の呼び出し可能なデコレータとして使用することができます。 foo
が何を返す可能性があるので
@foo
def bar(...):
は、当然のことながら
def bar(...):
...
bar = foo(bar)
として
正確同じであることを忘れないでください、あなたは関数が飾られているか否かをチェックする方法がありません。
foo
はいいかもしれませんが、マークを残すことはできますが、そうする必要はありません。あなたには、いくつかのPythonコードを与えている、あなたはデコレーターあるすべてのものを見つけたい場合は
、あなたがして装飾された機能を探してツリーを歩いて抽象構文木にコードを解析することによって行うことができます。次に、デコレータの.id
を保存する例を示します。明らかに、あなたが望むならば、ast
オブジェクトを保存することができます。
>>> class DecoratorFinder(ast.NodeVisitor):
... def __init__(self, *args, **kwargs):
... super(DecoratorFinder, self).__init__(*args, **kwargs)
... self.decorators = set()
...
... def visit_FunctionDef(self, node):
... self.decorators.update(dec.id for dec in node.decorator_list)
... self.generic_visit(node)
...
>>> finder = DecoratorFinder()
>>> x = ast.parse("""
... @dec
... def foo():
... pass
... """)
>>> finder.visit(x)
>>> finder.decorators
set(['dec'])
実際には少なくとも1つの位置引数を取る呼び出し可能です。 –
@Niklasあなたはもちろん正しい=) – katrielalex
- 1. SQL Server 2008がR2リリースであるかどうかはどのように確認できますか?
- 2. iPadにプログラムでWiFi接続があるかどうかをどのように確認できますか?
- 3. 「canplaythrough」が真であるかどうかをどのように確認できますか?
- 4. オブジェクトがMockitoモックであるかどうかをどのように確認できますか?
- 5. Python:PythonにSSLがあるかどうかをどのように確認できますか?
- 6. クラスに静的メソッドがあるかどうかを確認
- 7. Androidにインテントエクストラが存在するかどうかはどのようにして確認できますか?
- 8. Scala - オブジェクトがスレッドセーフであるかどうかを確認するにはどうすればよいですか?
- 9. フォームがヘルプモードであるかどうかを確認するにはどうすればよいですか?
- 10. アンドロイドアプリがハイブリッドアプリであるかどうかを確認するにはどうすればよいですか?
- 11. Java - シーンがフルスクリーンモードであるかどうかを確認するにはどうすればよいですか?
- 12. ジェネリックメソッドパラメータが値型であるかどうかを確認するにはどうすればよいですか?
- 13. オブジェクトがコレクションであるかどうかを確認するにはどうすればよいですか? (スウィフト)
- 14. ウィンドウがオフスクリーンであるかどうかを確認するにはどうすればよいですか?
- 15. ファイルが空であるかどうかを確認するにはどうすればよいですか?
- 16. URLが画像であるかどうかを確認するにはどうすればよいですか?
- 17. TextFieldが整数であるかどうかを確認するにはどうすればよいですか?
- 18. オブジェクトが「空」であるかどうかを確認するにはどうすればよいですか?
- 19. テキストエリアが空であるかどうかを確認するにはどうすればよいですか?
- 20. はどのように確認できますか?
- 21. ウェブサイトがC#でオンラインであるかどうかをどのように確認しますか?
- 22. LinkedListが既に注文されているかどうかはどのように確認できますか?
- 23. JVMでどのオブジェクトが特定の世代にあるのか、どのように確認できますか?
- 24. フォーム全体でどのテキストフィールドが空であるかをどのように確認できますか?
- 25. アドレスが共有メモリにあるかどうかを確認できますか?
- 26. 画像が色付きであるかどうかを確認
- 27. Facebookのタイムラインがあるかどうかを確認するにはどうすればよいですか?
- 28. プッシュ通知がiOSで配信されたかどうかはどのように確認できますか?
- 29. WooCommerce製品がサブスクリプションであるかどうか確認できますか?
- 30. コンピュータにWiFiアダプタがあるかどうかを確認するにはどうすればよいですか?
※デコレータとして使用することはできますか*、または*はどこかのデコレータとして使用されますか?最初のものは非常に難しいと証明できますが、一般的には解くことが不可能ではないにしても、2番目のものは実際に実行可能かもしれません。 –
または機能が装飾されているかどうか尋ねていますか? – forivall
@ NiklasB。申し訳ありません - 質問を明確にしました。 –