함수 반환 유형 및 인수 유형을 아는 방법?


84

나는 파이썬의 덕 타이핑 개념을 알고 있지만 때때로 함수의 인수 유형이나 함수의 반환 값 유형으로 어려움을 겪습니다.

이제 내가 직접 함수를 작성하면 유형을 알 수 있습니다. 하지만 누군가 내 함수를 사용하고 호출하기를 원하면 어떻게 유형을 알 수 있을까요? 일반적으로 함수의 독 스트링에 유형 정보를 넣습니다 (예 : "...the id argument should be an integer...""... the function will return a (string, [integer]) tuple.")

그러나 독 스트링에서 정보를 찾고 (그리고 코더로서 거기에 넣는) 실제로 그것이 수행되어야하는 방식입니까?

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


2
짧은 대답은 "예"입니다. 긴 대답은 "물론 그렇습니다"입니다. Python 코드를 많이 살펴 봤는지는 모르겠지만 실제로 사용하는 패키지를 표시하도록 질문을 업데이트 하여 라이브러리 코드에서 작업이 수행되는 방식을 확인하기 위해 읽을 수있는 코드로 안내 할 수 있습니다. 실제로 지금 사용하고 있습니다.
S.Lott 2011 년

@ S.Lott : 저는 현재 기계화 패키지로 어려움을 겪고 있지만 (안타깝게도) 문서화가 제대로되지 않은 것 같습니다.
Rabarberski 2011 년

4
많은 코드를 빠르게 작성할 수 있고 반환 유형, 인수 유형, 런타임 성능, 향후 10 년 동안 스파게티 코드를 사용하고 유지 관리해야하는 사람들 등과 같은 평범한 일에 대해 걱정할 필요가 없기 때문에 Python은 멋집니다. Sigh .
jarmod 2013 년

답변:


120

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

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

이제 다음과 같이 작성할 수 있습니다.

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

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

자세한 설명은 PyCharm 블로그의 유형 힌트에 대한 블로그 게시물을 참조하십시오 .


구문을 암시 유형은 또한 파이썬 2.7에 대한 제안했다 참고 여기에 같은 PEP-0,484인치 그리고 적어도 2017.3 버전부터는 PyCharm에서 작동합니다.
viddik13 2018-08-26

1
정확히 동일한 정의를 가진 인사 함수가 int 유형의 객체를 반환하면 오류가 발생하지 않습니다. 그렇다면 반환 유형을 명시 적으로 언급하지만 규칙을 따르지 않고 다른 유형의 객체를 반환하는 경우 이러한 유형 검사의 사용법은 무엇입니까?
Arashsyh

2
@Arashsyh : 네, 맞습니다. 타입 힌팅은 파이썬을 정적으로 타입 화 된 언어로 바꾸지 않습니다. 올바른 타입을 올바른 방식으로 사용하는 것은 여러분에게 달려 있습니다. 그리고 이러한 유형 힌트는 코드를 더 빠르게 개발하고 자체 문서화하거나 무언가를 엉망으로 만들 때 경고를받는 데 도움이됩니다. 특히 PyCharm (또는 유사한 IDE)을 사용하는 경우 다른 유형을 사용하는 경우 경고를 표시하고 다른 몇 가지 작업에 도움이됩니다. 위의 답변에서 제안 된 블로그 게시물을 읽는 것이 좋습니다.
Nerxis

이것은 계산적으로 더 빠릅니까?
Bryce Wayne

17

이것이 동적 언어가 작동하는 방식입니다. 그래도 항상 좋은 것은 아닙니다. 특히 문서가 좋지 않은 경우-누구든지 잘못 문서화 된 파이썬 프레임 워크를 사용하려고 했습니까? 때때로 당신은 소스를 읽는 것으로 되돌아 가야합니다.

다음은 덕 타이핑 문제를 방지하는 몇 가지 전략입니다.

  • 문제 도메인에 대한 언어 생성
  • 이름을 올바르게 지정하는 데 도움이됩니다.
  • 유형을 사용하여 도메인 언어로 개념을 나타냅니다.
  • 도메인 언어 어휘를 사용하여 이름 함수 매개 변수

또한 가장 중요한 사항 중 하나 :

  • 데이터를 가능한 한 로컬로 유지하십시오!

잘 정의되고 문서화 된 몇 가지 유형 만 전달되어야합니다. 코드를 살펴보면 다른 것은 분명해야합니다. 코드 주변을 살펴보면 알아낼 수없는 이상한 매개 변수 유형이 멀리서 나오지 마십시오.

관련 (또한 독 스트링과 관련이 있음), 파이썬에는 doctests. 이를 사용하여 방법이 어떻게 사용될 것으로 예상되는지 문서화하고 동시에 멋진 단위 테스트 범위를 갖습니다!


1
Numpy 문서는 위의 답변에 명시된 철학의 좋은 대표적인 예입니다.
Jerry

5

예, 클래스와 함수를 다른 프로그래머에게 더 친숙하게 만들려면 독 스트링을 사용해야합니다.

더보기 : http://www.python.org/dev/peps/pep-0257/#what-is-a-docstring

일부 편집기에서는 입력하는 동안 독 스트링을 볼 수 있으므로 작업이 더 쉬워집니다.


+1 : 문서화하세요. 이것은 유일한 올바른 방법입니다. 정적으로 입력 된 언어도 마찬가지입니다. 반환 유형은 전체 그림에서 중요하지 않은 부분입니다.
detly

제 타입이 너무 좋아요. 감사합니다. 문서 + 유형 = 하늘
masm64

5

나는 Coursera 과정에 참석했고, 그 과정에서 디자인 레시피에 대해 배웠습니다.

docstring 형식 아래에서 preety가 유용하다는 것을 알았습니다.

정의 영역 (베이스, 높이) :
    '' '(숫자, 숫자)-> 숫자 # ** TypeContract **
    치수가 # ** Description ** 인 트링 영역을 반환합니다.
    그리고 높이

    >>> area (10,5) # ** 예제 **
    25.0
    >> 면적 (2.5,3)
    3.75
    '' '
    리턴 (베이스 * 높이) / 2 

이런 식으로 독 스트링을 작성하면 개발자에게 많은 도움이 될 것 같습니다.

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


2

네, 그렇습니다.

Python에서 함수가 항상 동일한 유형의 변수를 반환 할 필요는 없습니다 (함수가 항상 동일한 유형을 반환하면 코드를 더 읽기 쉽게). 즉, 함수에 대해 단일 반환 유형을 지정할 수 없습니다.

같은 방식으로 매개 변수도 항상 같은 유형일 필요는 없습니다.


1

예 : 함수가 튜플 목록을 반환하고 각 튜플 (node_id, node_name, uptime_minutes) 형식의 각 튜플과 요소가 각각 문자열, 문자열 및 정수라는 것을 독 스트링에서 간결하게 설명하는 방법은 무엇입니까?

음 ... 이것에 대한 "간결한"설명은 없습니다. 복잡합니다. 당신은 그것을 복잡하게 설계했습니다. 그리고 독 스트링에 복잡한 문서가 필요합니다.

미안하지만 복잡성은-음-복잡합니다.


2
확인. 주제에서 벗어난 (일종의) : 그렇다면 더 깨끗한 디자인은 무엇일까요? 클래스?
Rabarberski 2011 년

@Rabarberski : 반드시 그런 것은 아닙니다. 여기서 복잡성은 피할 수없는 것처럼 들립니다. 간결함이 항상 달성 가능하거나 바람직한 것은 아닙니다.
S.Lott 2011 년

이런 종류의 것을 문서화하는 명백한 방법은 list <tuple <int, str, int >>와 같이 Java 제네릭과 유사한 것을 사용하는 것입니다. 그러나 그것은 좋든 나쁘 든 파이썬 방식이 아닙니다.
skyler 2012 년


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.