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
내 요약:
간단히
->
개발자가 기능의 반환 유형을 선택적으로 지정하도록 하기 위해 도입된다.Python 강화 제안 3107을 참조하십시오.이것은 Python이 광범위하게 채택됨에 따라 미래에 상황이 어떻게 전개될 수 있는지를 보여주는 지표로, 강한 타이핑을 향한 지표로, 이것은 나의 개인적인 관찰이다.
인수의 유형도 지정할 수 있다.함수와 인수의 반환 유형을 지정하면 논리적 오류를 줄이고 코드 개선을 개선하는 데 도움이 될 것이다.
식을 반환 유형으로 지정할 수 있으며(함수와 파라미터 수준에서 모두) 식의 결과는 주석 객체의 '반환' 속성을 통해 액세스할 수 있다.람다 인라인 함수의 식/반환 값에 대한 주석은 비어 있다.
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
'programing' 카테고리의 다른 글
활자를 사용하여 여러 개의 반환 유형을 지정하는 방법 (0) | 2022.04.04 |
---|---|
Python에서 개체의 복사본을 만드는 방법 (0) | 2022.04.04 |
Windows에서 여러 Python 버전을 실행하는 방법 (0) | 2022.04.04 |
내포 환원기 (0) | 2022.04.04 |
기본 반응에서 경고를 제거하는 방법 (0) | 2022.04.04 |