programing

Python 함수 정의에서 ->는 무엇을 의미하는가?

prostudy 2022. 4. 4. 21:21
반응형

Python 함수 정의에서 ->는 무엇을 의미하는가?

나는 최근에 파이썬 3.3 문법 명세서를 보면서 흥미로운 것을 발견했다.

funcdef: 'def' NAME parameters ['->' test] ':' suite

옵션인 '화살표' 블록은 파이썬 2에 없었고 나는 파이썬 3에서 그 의미에 대한 정보를 찾을 수 없었다.이것은 Python이 맞으며 통역은 다음과 같이 받아들였다.

def f(x) -> 123:
    return x

나는 이것이 일종의 전제조건 구문일지도 모른다고 생각했지만, 다음과 같다.

  • 나는 테스트할 수 없다.x여기선 아직 정의되지 않은 상태라
  • 화살표 뒤에 무엇을 넣든 (예를 들어)2 < 1)) 기능 동작에 영향을 주지 않는다.

이 구문 스타일에 익숙한 사람이 설명해줄 수 있을까?

함수 주석이다.

좀 더 자세히 설명하자면, Python 2.x에는 다양한 유형의 개체에 메타데이터 문자열을 첨부할 수 있는 문서 스트링이 있다.이것은 놀라울 정도로 편리하기 때문에 파이썬 3은 매개변수와 반환 값을 설명하는 함수에 메타데이터를 첨부할 수 있게 함으로써 기능을 확장한다.

선입견의 사용 사례는 없지만, PEP는 몇 가지를 제안한다.한 가지 매우 편리한 방법은 매개변수의 예상 유형을 주석으로 붙일 수 있도록 하는 것이다. 그러면 주석을 검증하거나 올바른 유형으로 인수를 강요하는 장식가를 작성하는 것이 쉽다.또 다른 방법은 문서 문자열로 인코딩하는 대신 파라미터별 설명서를 허용하는 것이다.

이것들은 PEP 3107에서 다루는 기능 주석이다.구체적으로, 더->반환 함수 주석을 표시한다.

예:

def kinetic_energy(m:'in KG', v:'in M/S')->'Joules': 
    return 1/2*m*v**2
 
>>> kinetic_energy.__annotations__
{'return': 'Joules', 'v': 'in M/S', 'm': 'in KG'}

주석은 사전이므로 다음 작업을 수행하십시오.

>>> '{:,} {}'.format(kinetic_energy(12,30),
      kinetic_energy.__annotations__['return'])
'5,400.0 Joules'

단순히 문자열 대신 python 데이터 구조를 가질 수도 있다.

rd={'type':float,'units':'Joules',
    'docstring':'Given mass and velocity returns kinetic energy in Joules'}
def f()->rd:
    pass

>>> f.__annotations__['return']['type']
<class 'float'>
>>> f.__annotations__['return']['units']
'Joules'
>>> f.__annotations__['return']['docstring']
'Given mass and velocity returns kinetic energy in Joules'

또는 함수 속성을 사용하여 호출된 값을 검증할 수 있다.

def validate(func, locals):
    for var, test in func.__annotations__.items():
        value = locals[var]
        try: 
            pr=test.__name__+': '+test.__docstring__
        except AttributeError:
            pr=test.__name__   
        msg = '{}=={}; Test: {}'.format(var, value, pr)
        assert test(value), msg

def between(lo, hi):
    def _between(x):
            return lo <= x <= hi
    _between.__docstring__='must be between {} and {}'.format(lo,hi)       
    return _between

def f(x: between(3,10), y:lambda _y: isinstance(_y,int)):
    validate(f, locals())
    print(x,y)

인화

>>> f(2,2) 
AssertionError: x==2; Test: _between: must be between 3 and 10
>>> f(3,2.1)
AssertionError: y==2.1; Test: <lambda>

다음 코드에서:

def f(x) -> int:
    return int(x)

-> int라고 말할 뿐이다.f()정수를 반환하지만 함수가 정수를 반환하도록 강제하지는 않는다.리턴 주석(return adnotation)이라고 하며, 다음과 같이 접속할 수 있다.f.__annotations__['return'].

Python은 파라미터 주석도 지원한다.

def f(x: float) -> int:
    return int(x)

: float프로그램(및 일부 타사 라이브러리/문서, 예: pylint)을 읽는 사람에게 이 사실을 알려준다.x~이어야 한다float. 에 액세스된다.f.__annotations__['x'], 그리고 그 자체로는 아무런 의미도 없다.자세한 내용은 설명서를 참조하십시오.

https://docs.python.org/3/reference/compound_stmts.html#function-definitions https://www.python.org/dev/peps/pep-3107/

다른 답변이 말해주듯, the은->기호는 함수 주석의 일부로 사용된다. 파이썬의 >= 3.5하지만, 그것은 정의된 의미를 가지고 있다.

PEP 3107 - 기능 주석에서는 문법 변경, 의 존재 등을 정의하면서 명세서를 기술했다.func.__annotations__저장되어 있고, 사용 사례라는 사실이 여전히 공개되어 있다.

인 파이톤3.5그러나, PEP 484 - 형식 힌트는 다음과 같은 단일한 의미를 부여한다.->함수가 반환하는 유형을 나타내기 위해 사용된다.또한 주석 사용의 기존 용도에 대해 기술한 바와 같이, 향후 버전에서도 이러한 사항이 적용될 것으로 보인다.

가장 빠르게 상상할 수 있는 계획은 3.6의 비 타입-힌트 주석을 소리 없이 사용하지 않고, 3.7의 완전히 사용하지 않고, 파이썬 3.8의 주석 사용으로 유형 힌트를 선언하는 것이다.

(내 것)

이 작업은 다음과 같이 실제로 구현되지 않았다.3.6내가 알기로는 미래 버전과 부딪힐 것 같아.

이에 따라 귀하가 제공한 예는 다음과 같다.

def f(x) -> 123:
    return x

향후 금지될 것이며(그리고 현재 버전에서는 혼란스러울 것이다), 다음과 같이 변경해야 할 것이다.

def f(x) -> int:
    return x

그 기능을 효과적으로 설명하기 위해서.f활자를 돌려주다.int.

그 주석들은 파이썬 자체에 의해 어떤 방식으로도 사용되지 않고, 그것은 거의 채워지고 무시된다.그들과 함께 일하는 것은 제3자 도서관의 몫이다.

이는 함수가 반환하는 결과의 유형을 의미하지만, 결과의 유형은 다음과 같을 수 있다.None.

파이톤 3.x를 지향하는 현대 도서관에는 널리 퍼져 있다.

예를 들어, 도서관 판다의 코드에는 다음과 같은 많은 곳에서 수익을 올리고 있다.

def get_description(self) -> dict:

def get_rejected_variables(self, threshold: float = 0.9) -> list:

def to_file(self, output_file: Path or str, silent: bool = True) -> None:
"""Write the report to a file.
def f(x) -> 123:
    return x

내 요약:

  1. 간단히->개발자가 기능의 반환 유형을 선택적으로 지정하도록 하기 위해 도입된다.Python 강화 제안 3107을 참조하십시오.

  2. 이것은 Python이 광범위하게 채택됨에 따라 미래에 상황이 어떻게 전개될 수 있는지를 보여주는 지표로, 강한 타이핑을 향한 지표로, 이것은 나의 개인적인 관찰이다.

  3. 인수의 유형도 지정할 수 있다.함수와 인수의 반환 유형을 지정하면 논리적 오류를 줄이고 코드 개선을 개선하는 데 도움이 될 것이다.

  4. 식을 반환 유형으로 지정할 수 있으며(함수와 파라미터 수준에서 모두) 식의 결과는 주석 객체의 '반환' 속성을 통해 액세스할 수 있다.람다 인라인 함수의 식/반환 값에 대한 주석은 비어 있다.

def function(arg)->123:

단순히 반환형인데, 이 경우 정수는 어떤 숫자를 쓰든 상관없다.

Java와 같이 :

public int function(int args){...}

그러나 파이썬에게 있어서 (짐 파사라키스 힐리어드가 말한 방식) 반환형은 힌트일 뿐이므로 반환을 제안하지만 어쨌든 끈처럼 다른 유형을 반환하도록 허용한다.

->는 python3에 소개되어 있다.

간단히 말해서 -> 뒤의 내용은 함수의 반환 유형을 나타낸다.반품 유형은 선택 사항이다.

def f(x) -> str:
return x+4

print(f(45))

결과를 : 49.

또는 '-' str'이 반환 형식에 영향을 미치지 않는 경우:

print(f(45).__class__)

<class 'int'>

단지 사용자에게 무엇을 기대하거나 값을 반환하는지를 알려주는 것이다.

funcname.__annotations__자세한 내용을 인쇄할 것이다.

맘에 들다

def function(name:str ,age:int) -> "printing the personal details ":
    print(f"name is {name} age is {age}")

function("test",20)
print(function.__annotations__)

출력

name is test age is 20
{'name': <class 'str'>, 'age': <class 'int'>, 'return': 'printing the personal details '}

값을 반환해도 아무 것도 표시되지 않는다.

참조URL: https://stackoverflow.com/questions/14379753/what-does-mean-in-python-function-definitions

반응형