[python] “at”(@) 기호는 파이썬에서 무엇을합니까?

@기호 를 사용한 일부 Python 코드를보고 있지만 그 기능이 무엇인지 전혀 모릅니다. 또한 파이썬 문서를 검색하거나 @기호가 포함될 때 Google이 관련 결과를 반환하지 않으므로 검색 대상을 알지 못합니다 .



답변

@줄의 시작 부분에 있는 기호는 클래스, 함수 및 메소드 데코레이터에 사용 됩니다.

더 많은 것을 읽으십시오 :

PEP 318 : 데코레이터

파이썬 데코레이터

가장 일반적인 파이썬 데코레이터는 다음과 같습니다.

@특성

@classmethod

static

당신이 표시되는 경우 @라인의 중간에, 그것은 다른 것, 행렬 곱셈이다. 아래로 스크롤하여를 사용하는 다른 답변을 봅니다 @.


답변

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즉시 후 @로그인합니다.

첫 목격

마이크로 프레임 워크 플라스크 는 처음부터 다음 형식으로 데코레이터 를 소개 합니다.

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

이것을 깨닫고 마침내 플라스크와 평화를 느낄 수있었습니다.


답변

이 코드 스 니펫 :

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]]


답변

“at”(@) 기호는 파이썬에서 무엇을합니까?

간단히 말해서 데코레이터 구문과 행렬 곱셈에 사용됩니다.

데코레이터와 관련하여이 구문은 다음과 같습니다.

@decorator
def decorated_function():
    """this function is decorated"""

이것과 같습니다 :

def decorated_function():
    """this function is decorated"""

decorated_function = decorator(decorated_function)

행렬 곱셈의 맥락에서, a @ b원용 a.__matmul__(b)– 구문 제조 :

a @ b

에 해당

dot(a, b)

a @= b

에 해당

a = dot(a, b)

여기서 dot, 예를 들어, 행렬 곱셈 NumPy와 기능하고 ab행렬이다.

어떻게 스스로 이것을 발견 할 수 있습니까?

@ 기호가 포함되어 있으면 Python 문서를 검색하거나 Google이 관련 결과를 반환하지 않으므로 검색 대상을 알지 못합니다.

특정 파이썬 구문이 무엇을하는지 완전히 이해하려면 문법 파일을 직접보십시오. 파이썬 3 브랜치 :

~$ grep -C 1 "@" cpython/Grammar/Grammar

decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
decorators: decorator+
--
testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [',']
augassign: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' |
            '<<=' | '>>=' | '**=' | '//=')
--
arith_expr: term (('+'|'-') term)*
term: factor (('*'|'@'|'/'|'%'|'//') factor)*
factor: ('+'|'-'|'~') factor | power

우리는 여기 @에서 세 가지 상황에서 사용되는 것을 볼 수 있습니다.

  • 데코레이터
  • 요인들 사이의 연산자
  • 증강 할당 연산자

데코레이터 구문 :

“decorator python docs”에 대한 Google 검색은 “Python Language Reference”의 “Compound Statements”섹션의 최상위 결과 중 하나입니다. “decorator”라는 단어를 검색하여 찾을 수있는 함수 정의 섹션으로 스크롤 하면 읽을 내용이 많이 있습니다. 그러나 “장식 자” 라는 단어 는 용어집연결되어 있습니다 .

데코레이터

일반적으로 @wrapper구문을 사용하여 함수 변환으로 적용되는 다른 함수를 반환하는 함수 입니다. 데코레이터의 일반적인 예는 classmethod()staticmethod()입니다.

데코레이터 구문은 단순한 구문 설탕이며 다음 두 함수 정의는 의미 상 동일합니다.

def f(...):
    ...
f = staticmethod(f)

@staticmethod
def f(...):
    ...

동일한 개념이 클래스에 존재하지만 덜 일반적으로 사용됩니다. 데코레이터에 대한 자세한 내용은 함수 정의 및 클래스 정의에 대한 설명서를 참조하십시오.

그래서 우리는

@foo
def bar():
    pass

의미 적으로 다음과 같습니다.

def bar():
    pass

bar = foo(bar)

파이썬은 데코레이터 ( @) 구문을 사용하여 bar 이전에 foo 표현식 (점선 조회 및 함수 호출 일 수 있음)을 평가하지만 다른 경우 bar 의 foo 표현식 평가하기 때문에 정확히 동일하지는 않습니다 .

(이러한 차이점이 코드의 의미에 차이가있는 경우 병리학적인 것이기 때문에 인생에서하고있는 일을 재고해야합니다.)

누적 데코레이터

함수 정의 구문 문서로 돌아 가면 다음을 볼 수 있습니다.

@f1(arg)
@f2
def func(): pass

대략적으로

def func(): pass
func = f1(arg)(f2(func))

이것은 데코레이터 인 함수와 스택 데코레이터를 먼저 호출 할 수 있다는 것을 보여줍니다. 파이썬에서 함수는 일급 객체입니다. 즉, 함수를 다른 함수의 인수로 전달하고 함수를 반환 할 수 있습니다. 데코레이터는이 두 가지를 모두 수행합니다.

데코레이터를 쌓으면 정의 된대로 함수가 먼저 데코레이터에게 전달되고 그 다음에 계속 전달됩니다.

그것은 @데코레이터의 맥락에서 사용법을 요약합니다 .

운영자, @

언어 참조의 어휘 분석 섹션 에는 연산자에 대한 섹션 이 있으며 여기에는 연산자 가 포함됩니다 @.

다음 토큰은 연산자입니다.

+       -       *       **      /       //      %      @
<<      >>      &       |       ^       ~
<       >       <=      >=      ==      !=

다음 페이지에서, 데이터 모델, 우리는 절로 Emulation 소프트웨어 숫자 유형 ,

object.__add__(self, other)
object.__sub__(self, other)
object.__mul__(self, other)
object.__matmul__(self, other)
object.__truediv__(self, other)
object.__floordiv__(self, other)

[…] 이러한 방법은 (이진 산술 연산을 구현하기 위해 호출되는 +, -, *, @, /, //, …]

그리고 우리는 __matmul__그에 해당하는 것을 @봅니다. “matmul”에 대한 문서를 검색하면 “PEP 465-행렬 곱셈을위한 전용 접두사 연산자”아래에 “matmul”이 있는 Python 3.5의 새로운 기능에 대한 링크가 표시됩니다 .

이것은 정의에 의해 구현 될 수있다 __matmul__(), __rmatmul__()
__imatmul__()대한 반사 정규 및 제자리 행렬 곱셈.

(그래서 우리는 그것이 현재 @=버전 이라는 것을 배웁니다 ). 추가 설명 :

행렬 곱셈은 수학, 과학, 공학의 많은 분야에서 특히 일반적인 연산이며 @를 추가하면 더 깨끗한 코드를 작성할 수 있습니다.

S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)

대신에:

S = dot((dot(H, beta) - r).T,
        dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))

예를 들어이 연산자는 거의 모든 작업을 수행하기 위해 오버로드 될 수 있지만이 numpy구문을 사용하여 배열 및 행렬의 내부 및 외부 곱을 계산합니다.

>>> from numpy import array, matrix
>>> array([[1,2,3]]).T @ array([[1,2,3]])
array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])
>>> array([[1,2,3]]) @ array([[1,2,3]]).T
array([[14]])
>>> matrix([1,2,3]).T @ matrix([1,2,3])
matrix([[1, 2, 3],
        [2, 4, 6],
        [3, 6, 9]])
>>> matrix([1,2,3]) @ matrix([1,2,3]).T
matrix([[14]])

전체 행렬 곱셈 : @=

이전 사용법을 연구하는 동안 우리는 또한 적절한 행렬 곱셈이 있음을 알게됩니다. 우리가 그것을 사용하려고 시도하면, 그것이 numpy에 대해 아직 구현되지 않았다는 것을 알 수 있습니다 :

>>> m = matrix([1,2,3])
>>> m @= m.T
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: In-place matrix multiplication is not (yet) supported. Use 'a = a @ b' instead of 'a @= b'.

그것이 구현되면 결과는 다음과 같습니다.

>>> m = matrix([1,2,3])
>>> m @= m.T
>>> m
matrix([[14]])


답변

“at”(@) 기호는 파이썬에서 무엇을합니까?

@ 기호는 구문 설탕 파이썬 활용 제공하는 것입니다 decorator,
그것은 정확히 파이썬으로 장식 않는 무엇에 대해 질문을 의역하는거야?

간단히 말하면 decorator주어진 함수의 정의를 가장 안쪽에 닿지 않고 수정할 수 있습니다 (닫힘).
타사에서 멋진 패키지를 가져 오는 경우가 가장 많습니다. 당신은 그것을 시각화하고 사용할 수는 있지만 가장 안쪽과 마음을 만질 수는 없습니다.

다음은 간단한 예 입니다 .Ipython
에서 read_a_book함수를 정의한다고 가정 하십시오.

In [9]: def read_a_book():
   ...:     return "I am reading the book: "
   ...:
In [10]: read_a_book()
Out[10]: 'I am reading the book: '

알다시피, 이름을 추가하는 것을 잊었습니다.
그러한 문제를 해결하는 방법? 물론 함수를 다음과 같이 재정의 할 수 있습니다.

def read_a_book():
    return "I am reading the book: 'Python Cookbook'"

그럼에도 불구하고 원래 기능을 조작 할 수 없거나 처리 할 수천 가지 기능이있는 경우 어떻게해야합니까?

다르게 생각하여 문제를 해결하고 new_function을 정의하십시오.

def add_a_book(func):
    def wrapper():
        return func() + "Python Cookbook"
    return wrapper

그런 다음 사용하십시오.

In [14]: read_a_book = add_a_book(read_a_book)
In [15]: read_a_book()
Out[15]: 'I am reading the book: Python Cookbook'

타다, 당신은 read_a_book내부 폐쇄를 건드리지 않고 수정 했습니다. 아무것도 나를 장착 중지합니다 decorator.

무엇에 관한 것 @

@add_a_book
def read_a_book():
    return "I am reading the book: "
In [17]: read_a_book()
Out[17]: 'I am reading the book: Python Cookbook'

@add_a_book말할 수있는 환상적이고 편리한 방법입니다 read_a_book = add_a_book(read_a_book). 그것은 구문 설탕이며 그것에 대해 더 멋진 것은 없습니다.


답변

Numpy 라이브러리를 사용하는 파이썬 노트북에서 일부 코드를 참조하는 경우 Matrix Multiplication@ operator의미 합니다. 예를 들면 다음과 같습니다.

import numpy as np
def forward(xi, W1, b1, W2, b2):
    z1 = W1 @ xi + b1
    a1 = sigma(z1)
    z2 = W2 @ a1 + b2
    return z2, a1