파이썬에서 타입 힌트로 기본 매개 변수 값 추가


236

다음과 같은 기능이 있다면 :

def foo(name, opts={}):
  pass

그리고 매개 변수에 유형 힌트를 추가하고 싶습니다. 어떻게합니까? 내가 가정 한 방식으로 구문 오류가 발생합니다.

def foo(name: str, opts={}: dict) -> str:
  pass

다음은 구문 오류를 발생시키지 않지만이 경우를 처리하는 직관적 인 방법은 아닙니다.

def foo(name: str, opts: dict={}) -> str:
  pass

typing설명서 나 Google 검색 에서 찾을 수 없습니다 .

편집 : 파이썬에서 기본 인수가 어떻게 작동하는지 알지 못했지만이 질문을 위해 위의 예제를 유지합니다. 일반적으로 다음을 수행하는 것이 훨씬 좋습니다.

def foo(name: str, opts: dict=None) -> str:
  if not opts:
    opts={}
  pass

4
마지막 기능은 올바른 방법입니다. 이 같은 방식의 scala언어가 너무 그것을 않습니다.
이스라엘 Unterman 18

14
변경 가능한 기본 유형이 있습니다. 문제가 발생할 수 있습니다
noɥʇʎԀʎzɐɹƆ

내 업데이트 대답 @josh 참조
noɥʇʎԀʎzɐɹƆ

@ noɥʇʎԀʎzɐɹƆ 예를 들어 메모와 같은 용도로 사용하지 않는 한 아닙니다. : P
Mateen Ulhaq

답변:


281

두 번째 방법은 맞습니다.

def foo(opts: dict = {}):
    pass

print(foo.__annotations__)

이 출력

{'opts': <class 'dict'>}

PEP 484에 나열되지 않은 것은 사실 이지만, 유형 힌트는 PEP 3107에 설명 된 함수 주석의 응용 프로그램입니다 . 구문 섹션 에서는 키워드 인수가 함수 주석과 함께 작동하는 방식을 명확하게 설명합니다.

변경 가능한 키워드 인수를 사용하지 않는 것이 좋습니다. 자세한 내용은 여기를 참조 하십시오 .


1
legacy.python.org/dev/peps/pep-3107/#syntax를 참조하십시오 . 타입 힌트는 함수 주석을 적용한 것입니다.
chepner

@chepner 사실입니다. PEP 3107에 키워드 인수에 대한 내용이 있다는 것을 몰랐습니다.
noɥʇʎԀʎzɐɹƆ

2
와우, 파이썬의 가변 기본 인수에 대해 몰랐습니다. 특히 기본 인수가 다르게 작동하는 Javascript / Ruby에서 왔습니다. 그것에 대해 이미 광고 구역에 대해 말한 것을 다시 해치지 않을 것입니다, 나는 그것이 나를 물기 전에 이것에 대해 알게되어 기쁩니다. 감사!
josh

6
딥 카피없이 해당 객체에 대한 돌연변이가 반복간에 지속되므로 {} 또는 []와 같은 가변 유형이나 기본 객체 대신 None을 사용하는 것이 좋습니다.
MrMesees

2
변경 가능한 키워드 인수를 사용하여 충분한 함수를 정의하면 삶의 선택에 대해 질문하는 4 시간의 디버깅 세션을 되돌아 보는 것은 시간 문제 일뿐입니다.
Joseph Sheedy

20

당신이 사용하는 경우 입력 (파이썬 3.5에서 도입을) 당신이 사용할 수있는 typing.Optional경우, Optional[X]동일합니다 Union[X, None]. 의 명시 적 값 None이 허용됨 을 알리는 데 사용됩니다 . 에서 typing.Optional :

def foo(arg: Optional[int] = None) -> None:
    ...

2
힌트가 아닌 키워드 인수에 대한 규칙처럼 =in 주위에 공백이 없어야 Optional[int] = None합니까?
actual_panda

7

나는 최근에이 하나의 라이너를 보았다 :

def foo(name: str, opts: dict=None) -> str:
    opts = {} if not opts else opts
    pass

안녕하세요 @Kirkalicious, 답변 주셔서 감사합니다. 작동 원리를 설명해 주시겠습니까?
Nathan

1
기본 매개 변수로 전달 된 빈 dict는 모든 호출에 대해 동일한 dict입니다. 따라서 함수가 변경하면 다음에 기본값은 마지막 시간에서 변경된 값이됩니다. 만들기 None기본 및 방법은 새로운 딕셔너리에게 메소드가 호출 될 때마다 시간을 할당하여이 문제를 피할 안에 다음 확인.
Ian Goldby
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.