シンボルを使用した Python コードを見ています@
が、それが何をするのかわかりません。@
また、シンボルが含まれているとPythonドキュメントを検索したり、Googleが関連する結果を返さないため、何を検索すればよいかわかりません。
14 に答える
@
行頭の記号は、クラス、関数、およびメソッドのデコレータに使用されます。
ここでもっと読む:
遭遇する最も一般的な Python デコレータは次のとおりです。
行の途中にが表示されている場合@
、それは別のもので、行列の乗算です。二項演算子としての使用を示すこの回答を参照してください。@
例
class Pizza(object):
def __init__(self):
self.toppings = []
def __call__(self, topping):
# When using '@instance_of_pizza' before a function definition
# the function gets passed onto 'topping'.
self.toppings.append(topping())
def __repr__(self):
return str(self.toppings)
pizza = Pizza()
@pizza
def cheese():
return 'cheese'
@pizza
def sauce():
return 'sauce'
print pizza
# ['cheese', 'sauce']
これは、デコレータの後に定義している//が、基本的に記号の直後のfunction
/に渡されることを示しています。method
class
argument
function
method
@
最初の目撃
マイクロフレームワークFlaskは、次の形式で最初からデコレーターを導入します。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
これは、次のように変換されます。
rule = "/"
view_func = hello
# They go as arguments here in 'flask/app.py'
def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
pass
これを実現することで、ようやく Flask に安心感を覚えることができました。
このコード スニペット:
def decorator(func):
return func
@decorator
def some_func():
pass
次のコードと同等です。
def decorator(func):
return func
def some_func():
pass
some_func = decorator(some_func)
デコレーターの定義では、通常は関数によって返されない変更されたものを追加できます。
@
Python 3.5では、演算子としてオーバーロードできます。行列の乗算を行うように設計されているため、という名前が付けられて__matmul__
いますが、任意のものにすることができます。詳細はPEP465を参照してください。
これは行列乗算の単純な実装です。
class Mat(list):
def __matmul__(self, B):
A = self
return Mat([[sum(A[i][k]*B[k][j] for k in range(len(B)))
for j in range(len(B[0])) ] for i in range(len(A))])
A = Mat([[1,3],[7,5]])
B = Mat([[6,8],[4,2]])
print(A @ B)
このコードは次の結果をもたらします。
[[18, 14], [62, 66]]
デコレータを使用していることを示します。これは2008 年の Bruce Eckel の例です。