2009-10-13 8 views
13

파이썬에서는 명시 적 리턴이없는 프로 시저를 만들 수 있습니다. 도대체 그파이썬 프로 시저 반환 값

>>> a = test(7) 
>>> print `a` 
'None' 

이유 : 즉 : 또한

def test(val): 
    if 0 == val: 
     return 8 

, 그것은 변수에 그 함수의 결과를 할당 에 가능? 그 어수선한 디자인 결정 뒤에있는 언어 논리는 무엇입니까? 왜 단순히 컴파일러 오류가 발생하지 않습니까?

편집 : 예, 그렇게 작동한다는 것을 알고 있습니다. 감사. 제 질문은 왜입니까? 그것은 당신의 코드에 미묘한 버그를 소개하는 그런 확실한 화재 방법 같아 보입니다. 그리고 아래에서 언급 한 것처럼, e-satis는 "명백한 것이 더 낫다"는 매우 현명한 파이썬의 격언에 반대하는 것으로 보인다.

그럼,이게 뭐야? 단지 설계 감독 또는 간소화 가정인가 의도적으로 고려 된 결정입니까?

편집 : 모든 사람이 이런 식으로 의도를 표현하는 것이 훨씬 더 동의하지 않았다 : 그렇다면

def test(val): 
    if 0 == val: 
     return 8 
    else: 
     return None 

, 왜 파이썬은 컴파일 시간 예외를 발생에 이전 스타일을 선호?

EDIT : S.Lott은 명시 적으로 포인트를 가져오고 (다른 사람들도 마찬가지입니다.이 동작은 파이썬이 동적 언어이므로 그 점을 확인할 수 없음을 나타냅니다. 컴파일 시간, 시스템의 런타임 동작.

프로 시저 (값을 반환하지 않는 함수)와 함수 (수행하는 함수) 사이에는 구분이 없으므로 컴파일 타임에 적용 할 내용이 없습니다. 즉, 런타임에 동작 할 때 우리는 예외적 인 경우가 발생하거나 프로그래머가 기본 동작을 이해하고 무엇을하고 있는지를 알고 있다고 가정하고 조용히 실패하는 경우도 있습니다.

파이썬 방법은 후자를 수행하는 것이고, C 스타일 방법은 전자를 수행하는 것입니다.
그런 식으로 그렇게하는 것이 타당한 것처럼 보인다.

S.Lott의 명확한 정당화가 허용되는 답변에 주석에 묻혀 있으므로 여기에 요약하는 것이 가장 좋습니다.

S.Lott이 정식 답을 얻는 지 확인하기 위해 대답을 수락하지 않습니다. 그렇지 않으면 SilentGhost에 포인트를 줄 것입니다.

+1

모든 데프의 끝에'return'가 생각보다 의미가 있기를 바랍니다. –

+3

-1 : "디자인 감독"? 누구에 의해? 이 방법을 좋아하는 파이썬 커뮤니티 전체? 그것은 질문보다 더 비난처럼 보입니다. –

+2

없음의 기본 반환 값은 매우 유용합니다. 만약 당신이 원하지 않는 경우에는 함수의 마지막 줄로 예외를 발생 시키십시오. –

답변

22

모든 함수는 명시 적으로 반환하지 않을 수도 있지만 내재적 인 함수 즉, None을 가지며이 함수는 정상적인 Python 객체입니다. 또한 기능은 종종 명시 적으로 return None입니다.

암시 적으로 None을 반환하는 것이 단순한 사용 최적화라고 가정합니다.

P.

def t(): 
    if True: 
     return 'ham' 

P.P.S.을 : 나는 다음과 같은 경우에 할 것 컴파일 제안 궁금해return 문은 이 필요함을 나타내며 None, 42 또는 'spam'이됩니다. 그러나 어떤 함수는 실제로는 list.sort 또는 __init__과 같은 아무 것도 반환하지 않으므로 각 __init__ 끝에 return None 문을 요구하는 오버 헤드가 발생합니다.

+0

컴파일에 실패했습니다. 그것이 저의 요지입니다. – James

+2

"컴파일 실패"? 어떻게 그렇게? 가장 사소한 경우를 제외하고 모든 가능한 로직 경로를 검증하는 것은 불가능합니다. 'return someOtherFunction()'을 고려하십시오. 컴파일러가 어떤 종류의 "completeness"를 위해서'someOtherFunction'을 체크 할 수 있습니까? –

+0

하지만 그 예가 이해할 수 있습니다. 'if-else'가 있으면 괜찮을까요? – SilentGhost

2

그것은 아름답다 ...

그것은 나에게 이해가 val != 0 경우 None 반환합니다.

Python 2.6.1 (r261:67515, Jun 18 2009, 17:24:16) 
[GCC 3.3.3 (SuSE Linux)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> def test(val): 
...  if 0 == val: 
...   return 8 
... 
>>> a = test(8) 
>>> print a 
None 
>>> print test(0) 
8 
>>> 

왜 그 행동이 잘못 되었습니까?

강력한 컴파일 시간 유형 검사가 필요하면 C++를 사용할 수 있지만 Python의 경우 매우 유연한 것처럼 보이며 작업을 위해 Python을 선택했을 때 원하는 것으로 가정합니다.

+5

글쎄, 파이썬에서 명시 적으로 암시 적보다 낫다, 그래서 이것이 최고의 예제되지 않을 것 같아요. –

+0

어떤 e-satis가 말했다. 반환 값이 지정되지 않았으므로 의도 된 동작이 불분명하기 때문에 기본 동작은 잘못되었습니다. 파이썬에서는 불특정 다수를 할 수 없어야한다. – James

5

Heh. Java 관점에서 볼 때 질문은 분명합니다. 오류가 발생합니다.

하지만 Perl 관점에서 보면 분명하지 않습니다. 변수를 가치없는 것으로 설정하고 있습니다.

모두 타이핑에 관한 내용입니다. Java와 마찬가지로 Python은 strongly typed이지만 Java와 달리 dynamically typed입니다. 대부분의 동적 유형 지정 언어는 이런 헛소리를 허용합니다.

11

Python은 인간의 오작동을 확인하지 않습니다. 언어 철학은 프로그래머가 성인이되어 어른이되어 자신이하는 일을 알고 있다고 가정합니다.

가입일 : 당신이 함수를 반환 무엇 깜짝 할 사이에 알 수 있도록

  • 파이썬, autodocumented 언어입니다;
  • 파이썬은 덕 타이핑을 사용하므로 기본적으로 없음을 얻으면 동적 함수 호출을 쉽게 처리 할 수 ​​있습니다.

돌아 오는 중 오류를 발생시키는 것보다 더 많은 감각을 느끼게하는 요소는 없습니다.

는 예컨대 :

function_stack = FUNC1, FUNC2, func3]

for f in function_stack : 
    a = f() 
    if a is not None : 
     # do something 

F가 F 인 경우에 상관없이() 함수 또는 절차이다. 파이썬에는 그러한 것이 없다. 모든 기능을 적용하고 결과가있는 경우 출력을 처리 할 수 ​​있습니다.

+0

나는 동의하지 않는다. 모든 제품에서 의도적 인 디자인 결정으로이 구성을 허용하는 것은 드문 것처럼 보입니다. 함수가 None을 반환하기를 원한다면 반환하지 않을 것입니다. 아무런 수익도 얻고 싶지 않다면 나는 그 계약을 맺어야하며 반환 값을 변수에 할당 할 수 없어야합니다. 좋은 프로그래밍 스타일의 일부는 이러한 종류의 "트립 와이어"를 설정하여 바보 같은 실수를하지 않도록합니다. 이 "기능"은 바보 같은 실수에 특히 적합합니다. – James

+1

예, 함수에 전달 된 매개 변수가 * any * 유형이 될 수있는 "기능"처럼 - 어떤 아이디어가 * 그 * 아이디어와 함께 나온 것입니까?! @James, 당신은 파이썬이 중괄호 대신에 들여 쓰기를 사용하는 이유를 묻는다. 또는 중요한 방법들이 어떻게 그 모든 추악한 밑줄을 갖게되었는지; 또는 인터페이스가 지원되지 않는 이유는 무엇입니까? 이 동적 인 동작의 유용성을 파악할 수 없다면 몇 가지 코드를 작성해보십시오. 그리고 파이썬에있을 자바를 작성하지 말고, 여러분이 질문하는 바로 그 기능들을 사용해보십시오. 여전히 부자연 스럽다면 Java 또는 C#을 사용하는 것이 더 편할 것입니다. – PaulMcG

+6

와우, 와우, 쉬운 폴 :-) 다른 언어의 사람들은 파이썬에 좌절감을 느낄 수 있습니다. 파이썬을 사용하지 않으면 좌절감을 느낍니다. 우리가 할 수있는 유일한 생각은 말하기 위해서입니다 : 이것은 pythonistas 코드 방법입니다, 이것이 우리가 좋은 것이라고 생각하는 이유입니다. 다른 사람들이 그들이 원하는 부분을 차지하게하십시오, 거기에 접근하는 의미도 있습니다. @James : Python은 유연성을 위해 오류 검사를 수행합니다. 모든 파이썬 코더들이 알고있는 것은 거래입니다. 우리는 그것에 대해 매우 만족합니다. 당신은 당신을위한 것이 아닌 것처럼 느끼실 수 있습니다. 그러면 당신은 그렇게 느끼실 것입니다. –

1

어떤 컴파일러입니까? 바이트 코드 컴파일러는 가져 오기시 코드 구문을 검사하지만 구문에 "반환 경로 확인"은 포함되지 않습니다. 따라서 런타임에 test()가 호출되고 x의 값이 0이 아니며 함수에서 빠져 나오는 경우 이어야합니까? 0을 반환 하시겠습니까? 왜 -1이 아니거나 ""인가, 아니면 - 무한인가? 따라서 좋은 중립적 인 값은 명시 적 return 문이없는 경우 항상 반환되어야하며 그 값은 없음입니다. 이것은 언어의 표준 기능입니다 - 파이썬을 환영합니다!

+0

"작동하지 않기 때문에 작동하지 않습니다"? 시스템은 임의의 것을 선택하기보다는 어떤 결정을 내릴지 모를 때 바보 (barf)해야합니다. 나에게 이것은 정확하게 구문 오류이며 선언되지 않은 변수를 사용하는 것과 같은 방식으로 작동해야합니다. – James

+0

명시 적 return 문이없는 경우 반환되는 기본값은 임의적이지 않습니다. 항상 일관되게 singleton입니다. Ruby에서 명시 적 return 문이없는 경우 마지막 계산 된 값을 반환하도록 디자인을 결정했습니다. Smalltalk에는 객체에 대한 메소드 만 있고, 명시 적 return 문을 사용하지 않는 기본 반환 값은 대상 객체 자체입니다 ('^ self'라고도 쓰는 경우가 있습니다). 정적으로 형식화 된 언어는 모든 반환 값이 함수의 형식을 따르도록해야하지만 동적 형식의 언어에서는 필요하지 않습니다. – PaulMcG

+0

흥미 롭습니다. 내가 올바르게 당신을 이해한다면 그것은 두 가지 이유에서 이런 식으로 행동한다고 ​​말하고있는 것입니다 : 1) 역사적 맥락 (즉, 그것은 처음부터 - 어떤 이유에서든 - 그리고 그 행동을 깨뜨리는 것은 현명하지 않을 것입니다. 2) 언어 정의를 기반으로하는 불필요한 검사이므로 제외됩니다 (코드 포함이 더 나은 코드가 될 수 있음). 허. 당신은 그것을 명백한 대답으로 포함 시켜서 투표 할 수 있습니까? – James

1

이것은 때문입니다.

터보 파스칼의 절차와 기능을 구별하지 않아도됩니다. 그들은 모두 기능을 수행하며 기본적으로 None을 반환합니다. 이는 논리적으로 정확합니다. 아무 말도하지 않으면 아무 것도 반환하지 않습니다. None.

는 나는 지금 -

+0

없음과 "알 수 없음"은 매우 다른 두 가지 개념입니다. – James

+1

파이썬 함수가 명시 적 리턴없이 끝나면 None을 반환합니다. 이것은 문서화되어있다. 나는 "Unknown"이 그것에 어떻게 들어오는지를 보지 못했다. "명시 적으로는 암시 적보다 낫다"는 한계가 있습니다. 'if x :'가 'bool (x)가 참인 경우'보다 강하게 선호된다. 또 다른 한 가지는 값을 반환하지 않는 한 값을 반환하면 안되며 'None'이 반환된다는 것을 알아야합니다. 동적 인 구조를 훨씬 쉽게 만듭니다. 명시 적으로 반환하는 것보다 Python으로 표현하기가 훨씬 더 어려운 유스 케이스를 보여줄 수 없다면 당신의 케이스가 매우 강하다고 생각하지 않습니다. – jcdyer

관련 문제