programing

함수 반환 유형 및 인수 유형을 아는 방법은 무엇입니까?

lastmoon 2023. 7. 16. 17:47
반응형

함수 반환 유형 및 인수 유형을 아는 방법은 무엇입니까?

저는 파이썬의 오리 타입 개념을 알고 있지만, 함수의 인수 유형이나 함수의 반환 값 유형과 씨름할 때가 있습니다.

이제, 제가 직접 함수를 작성했다면, 저는 종류를 알고 있습니다.하지만 누군가가 제 기능을 사용하고 호출하려고 한다면, 그/그녀는 어떻게 유형을 알 수 있을까요?를 입력합니다(예: 함문예문유입정력다니합보를형에열자서보통수의저는예(::▁i다▁(:"...the id argument should be an integer..."그리고."... the function will return a (string, [integer]) tuple.")

하지만 문서 문자열에서 정보를 찾는 것(코더로서 정보를 거기에 넣는 것)이 정말로 수행되어야 하는 방식입니까?

편집: 대다수의 답변이 "예, 문서!"를 지향하는 것처럼 보입니다.저는 이것이 '복잡한' 유형에게 항상 쉬운 것은 아니라고 생각합니다.
예를 들어, 함수가 각 튜플 형식(node_id, node_name, uptime_minutes)과 함께 튜플 목록을 반환하고 요소가 각각 문자열, 문자열 및 정수라고 간결하게 설명하는 방법은 무엇입니까?
Docstring PEP 설명서에는 이에 대한 지침이 없습니다.
그런 경우에는 클래스를 사용해야 한다는 반론이 있을 것으로 생각되지만, 파이썬은 목록과 튜플을 사용하여, 즉 클래스 없이 이러한 것들을 전달할 수 있기 때문에 매우 유연하다고 생각합니다.

2011년 이후로 상황이 조금 변했습니다!이제 Python 3.5에는 인수에 주석을 달거나 함수의 유형을 반환하는 데 사용할 수 있는 유형 힌트가 있습니다.예를 들어 다음과 같습니다.

def greeting(name):
  return 'Hello, {}'.format(name)

이제 다음과 같이 쓸 수 있습니다.

def greeting(name: str) -> str:
  return 'Hello, {}'.format(name)

이제 유형을 볼 수 있듯이, 유형 검사기가 코드를 조사하는 데 도움이 되는 일종의 선택적인 정적 유형 검사가 있습니다.

더 많은 설명을 위해 저는 PyCharm 블로그의 유형 힌트에 대한 블로그 게시물을 볼 것을 제안합니다.

이것이 역동적인 언어가 작동하는 방식입니다.하지만 그것이 항상 좋은 것만은 아닙니다, 특히 문서화가 부실한 경우 - 문서화된 파이썬 프레임워크를 사용하려고 한 사람이 있습니까?때때로 당신은 출처를 다시 읽어야 합니다.

다음은 오리 유형의 문제를 방지하기 위한 몇 가지 전략입니다.

  • 문제 도메인에 대한 언어 만들기
  • 이것은 당신이 물건의 이름을 올바르게 짓는 데 도움이 될 것입니다.
  • 도메인 언어로 개념을 표현하기 위해 유형 사용
  • 도메인 언어 어휘를 사용한 이름 함수 매개 변수

또한 가장 중요한 사항 중 하나입니다.

  • 데이터를 가능한 한 로컬에 보관합니다!

잘 정의되고 문서화된 몇 가지 유형만 전달되어야 합니다.코드를 보면 그 밖의 모든 것을 알 수 있습니다.코드 근처를 보면 알 수 없는 이상한 매개 변수 유형을 멀리서 가져오지 마십시오.

관련, (그리고 문서 문자열과도 관련이 있으며) 파이썬에는 다음과 같은 기술이 있습니다.doctests이를 사용하여 방법이 어떻게 사용될 것으로 예상되는지 문서화하고 동시에 우수한 단위 테스트 범위를 확보하십시오.

사실 파이썬은 동적 언어이기 때문에 필요가 없지만 반환 값을 지정하려면 다음을 수행합니다.

def foo(a) -> int: #after arrow type the return type 
       return 1 + a

하지만 별로 도움이 되지 않을 겁니다.자바, c, c++와 같은 정적 형식의 언어처럼 동일한 방식으로 예외를 제기하지 않습니다.문자열을 반환하더라도 예외가 발생하지 않습니다.

그런 다음 인수 유형에 대해 이렇게 합니다.

def foo(a: int) -> int:
      return a+ 1

:인수 유형을 지정할 수 있습니다. 또한이 되지 입니다, 를 들어 . 다음은 이를 증명하는 예입니다.

def printer(a: int) -> int: print(a)

printer("hello")

위의 함수는 실제로 방금 반환됩니다.None왜냐하면 우리는 아무것도 돌려주지 않았지만, 우리가 돌아올 것이라고 말했기 때문입니다.int하지만 제가 말했듯이 그것은 도움이 되지 않습니다.IDE에 도움이 될 수도 있습니다(모든 것은 아니지만 소수의 사람들이 좋아합니다.pycharm아니면 뭔가, 하지만 아닙니다.vscode)

저는 코스세라 수업을 들었고, 그 수업에서 디자인 레시피에 대해 배웠습니다.

아래 docstring 형식에서 pretety가 유용하다는 것을 참조하십시오.

디프 면적(베이스, 높이):
'''(번호,번호 ) -> 번호 #**형식계약**치수 기준이 있는 문자열 영역 반환 #**설명**및 높이
>>영역(10,5) #**예 **25.0
>> 영역(2.5,3)3.75'''리턴 (기본 * 높이) /2

이런 식으로 docstring이 작성된다면 개발자들에게 많은 도움이 될 것이라고 생각합니다.

동영상 링크 [동영상 보기] : https://www.youtube.com/watch?v=QAPg6Vb_LgI

예, 클래스와 기능을 다른 프로그래머에게 더 친숙하게 만들려면 문서 문자열을 사용해야 합니다.

추가: http://www.python.org/dev/peps/pep-0257/ #what-is-a-docstring

일부 편집기에서는 입력하는 동안 문서 문자열을 볼 수 있으므로 작업이 더욱 쉬워집니다.

>10년이 지난 지금, 제가 이 문제를 관리하는 데 사용하는 두 가지가 있습니다.

  • 힌트를 입력합니다(다른 답변에서 이미 언급한 대로).
  • 매개 변수 또는 반환 형식 힌트를 사용할 수 없거나 읽기 어려워지는 경우 데이터 클래스

후자의 예로, 제가 어떤 기능을 가지고 있다고 칩시다.

def do_something(param:int) -> list[tuple[list, int|None]]:
   ...
   return result

이제 다음과 같은 데이터 클래스를 사용하여 다시 작성합니다.

from dataclasses import dataclass

@dataclass
class Stat:
    entries: list
    value: int | None = None

 def do_something(param:int) -> list[Stat]:
   ...
   return result

네.

Python에서 함수는 항상 같은 유형의 변수를 반환할 필요는 없습니다. (비록 함수가 항상 같은 유형을 반환한다면 코드가 더 읽기 쉬울 것입니다.)즉, 함수에 대한 단일 반환 유형을 지정할 수 없습니다.

마찬가지로 매개 변수가 항상 동일한 유형일 필요는 없습니다.

네, 역동적인 타입의 언어이기 때문에 ;)

참조용으로 읽기: PEP 257

문서 문자열(및 일반적인 문서).Python 3은 PEP 3107에 설명된 바와 같이 (선택적인) 함수 주석을 도입합니다(그러나 docstring은 빼놓지 마십시오).

예를 들어, 함수가 각 튜플 형식(node_id, node_name, uptime_minutes)과 함께 튜플 목록을 반환하고 요소가 각각 문자열, 문자열 및 정수라고 간결하게 설명하는 방법은 무엇입니까?

음... 이것에 대한 "간단한" 설명은 없습니다.복잡해요.당신은 그것을 복잡한 것으로 설계했습니다.그리고 문서 문자열에 복잡한 문서가 필요합니다.

죄송하지만, 복잡성은 -- 글쎄요 -- 복잡합니다.

언급URL : https://stackoverflow.com/questions/5336320/how-to-know-function-return-type-and-argument-types

반응형