2010-05-05 3 views
4

파이썬 연산자에 "=="및 ">"줄을 사용하면 bool 대신 int가 반환됩니다. 나는 int 함수 (int(1 == 1))를 사용하거나 0 ((1 == 1) + 0)을 추가 할 수 있다는 것을 알고 있지만, 쉬운 방법이 있는지 궁금해하고있었습니다. 부서가 수레를 반환 할 때처럼 from __future__ import division을 입력 할 수 있습니다. int를 반환하는 연산자에서이 작업을 수행 할 수있는 방법이 있습니까? 또는 내가 원하는 것을 할 수있는 __future__._Feature 클래스를 만들 수 있습니까?int를 반환하는 파이썬 연산자

+1

이것은 명백한 동기없이 꽤 이상한 요청처럼 보입니다. 왜 이것이 필요하다고 생각하는지 더 설명해 주시겠습니까? –

+0

스택 기반 프로그래밍 언어를 만들고 있습니다. 보다 크거나 작은 것을 사용하면 스택에서 두 항목을 팝하고'stack.push (stack.pop()> stack.pop())'와 같은 일을합니다. 정수를 출력하고 싶다면 스택의 최상단을 가져 와서'str (stack.pop()) '를 사용하여 문자열로 변환하고 그것을 출력합니다. 나는 1이나 0이 인쇄되기를 원하지만 "True"또는 "False"를 출력합니다. 이렇게하면 if 문과 같은 것을 만들 때 문제가 발생합니다. – None

+5

파이썬에서 기본 연산자를 수정하는 것은 답이 아닙니다. 파이썬의> (자신의 함수를 작성)을 원하지 않거나, 부울을 문자열로 변환하기 위해 다른 동작을 원한다 (사용자 고유의 함수를 작성한다). –

답변

1

, 당신은 같은 것을에 비교 연산자를 변경 될 수 있습니다.

동일한 표현에서 stack.pop()을 두 번 호출하는 것에주의하십시오. 인수가 평가 될 순서를 알지 못하고 (다른 경우), Python의 다른 구현은 인수를 다른 순서로 매우 잘 나타낼 수 있습니다. 임시 변수를 사용해야합니다 :

x = stack.pop() 
y = stack.pop() 
stack.push(1 if x > y else 0) 
+0

나는 다른'stack.pop()'을 코드에서했지만 주석에 압축하려고했습니다. 어쨌든 고마워. – None

+0

표현식의 평가 순서는 언어 참조 (http://docs.python.org/reference/expressions.html#evaluation-order)에서 지정합니다. 즉, 부작용이있는 함수 호출을 사용하는 것은 일반적으로 좋지 않은 생각입니다. –

3

내장 비교 기능을 무시할 수 없습니다. 어떤 의미에서는 비교 연산자가 이미 int을 반환하고 있습니다. boolint의 하위 클래스이므로 int에 할 수있는 모든 작업을 수행 할 수 있습니다. 그런 다음 질문이 왜 bool 객체가 아닌 int 객체를 반환하도록하고 싶습니까? 간단하게 (__eq__, __ne__는, __gt__는, __lt____ge__, __le__가) 당신이 원하는 반환 관련 메소드를 구현 - 당신은 사용자 정의 클래스의 비교 연산자를 가질 수

1

당신이 원하는대로 돌아갑니다. 제어 할 수없는 개체의 경우 변경할 수 없지만 다음을 수행 할 필요가 없습니다. bool the Liskov substitution principle이므로 ints입니다. 기본 유형 '__eq__ 메쏘드와 다른 정수들에 의해 반환 된 bool 사이의 차이점을 알리는 코드는 그 결과를 잘못 사용하고 있습니다.

__future__ 모듈은 여기에 해당되지 않습니다. 원하는대로 할 수는 없으므로 파이썬에 추가 된 특정 설정을 변경하는 데만 사용할 수 있습니다. __future__ 가져 오기를 사용하면 파이썬에 추가 된 것이므로 실제 사업부로 나눌 수 있습니다. __future__ 가져 오기를 추가하는 유일한 방법은 Python 자체를 수정하는 것입니다. 당신이 좋아하는 것처럼 >1 또는 0의 부울 결과를 변환합니다

stack.push(1 if stack.pop() > stack.pop() else 0) 

이 : 당신의 설명을 바탕으로

1

자신의 개체에 대해 각 비교 연산자를 쉽게 재정의 할 수 있습니다. 내장 함수의 경우 재정의 메서드는 "읽기 전용"이므로이를 설정하려는 모든 시도가 바뀌지 않습니다.

>>> class foo: 
    def __lt__(self, other): 
     return cmp(5, other) 

>>> f = foo() 
>>> f<3 
1 
>>> f<7 
-1 
>>> f<5 
0 

>>> j="" 
>>> j.__lt__=lambda other: cmp(5, other) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
AttributeError: 'str' object attribute '__lt__' is read-only 
0

bool을 int로 변환 하시겠습니까?

1

>>> int(False)

0

아니면 STR에 그 캐스팅

>>> int(True)

? '0'

0

없음

>>> str(int(False))

'1'

>>> str(int(True))

, 당신은 할 수 없습니다. Guido는 유형 및 클래스를 통합 할 때 (내장 된 방식으로 인해) 내장 유형의 동작을 무시할 수있는 방법을 찾았지만 버그로 선언하고 허점을 막아 냈습니다. 내장 된 유형의 동작을 변경하는 것 (예를 들어, 미래의 부분을 임포트하는 것, 좋은 이유가 있음)은 금지되어 있습니다.

죄송합니다. 메일 링리스트 게시물을 찾을 수 없습니다. 나는 그것이 꽤 흥미 있었던 것에 따라 그것을 기억하고있다.