2014-01-09 3 views
0

이 간단한 질문파이썬은

x=1 
if x["status"] == "Error": 
    print "Fine" 
elif x == 1: 
    print "Good 

    Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    TypeError: 'int' object has no attribute '__getitem__' 

x에 제발 도와주세요 사전 값을 무시하는 정수 또는 사전 될 수있는 함수의 반환 값입니다. 내 IF 상태가 나에게 경고하는 것을 원하지 않습니다.

답변

5

try: 
    if x["status"] == "Error": 
     print "Fine" 
except TypeError: 
    if x == 1: 
     print "Good" 

또 다른 옵션은 명시 적으로 x 여부를 확인하는 것입니다은입니다 : 하나 확실한 해결책은 약간 오류를 처리하기 위해 현재의 코드를 수정한다또는 dict :이 파이썬의 오리 타이핑의 장점 중 일부를 제거하지만

if isinstance(x, dict) and x["status"] == "Error": 
    print "Fine" 
elif isinstance(x, int) and x == 1: 
    print "Good" 

; 첫 번째 버전에서는 x을 제공하는 함수가 float (x = 1.0)을 반환하는 경우에도 작동합니다.

0

xisinstance을 사용하는 사전인지 여부를 확인할 수 있습니다.

if isinstance(x, dict) and x["status"] == "Error": 
    print "Fine" 
elif x == 1: 
    print "Good 

하지만 더 바람직하게는 하나의 유형을 반환하는 함수를 변경하는 것이 좋습니다. 그것은이 딕셔너리

그리고 적절한 조치 경우 (X) == 딕셔너리 확인하는 INT

사용 형태이면

0

사용 형 (X) == INT를 조사

+0

'형식'에 'isinstance' 선호 : http://stackoverflow.com/questions/1549801/differences-between-isinstance-and-type-in-python – jonrsharpe

0

그것은 가장 유연한 오리 타이핑을 사용합니다 :

if x == 1: 
    print("Good") 
elif hasattr(x, '__getitem__') and x["status"] == "Error": 
    print("Fine") 

은 위의 정수 또는 사전에 어떤 x을 받아들입니다. 사전에있는 항목의 가치를 확인하려면 _getitem__ 방법이 필요하며 위의 방법으로 해당 항목을 확인합니다.

오리 타이핑에는 두 가지 이유가 있습니다. 한 가지는 사용자가 자신의 클래스를 만들고 코드를 사용하도록 기대할 수 있다는 것입니다. 다른 하나는 공식 파이썬 클래스가 변경 될 수 있다는 것입니다. 예를 들어 후자는 python 2 -> 3 전환으로 발생합니다. 이전 코드에서는 isinstance (x, unicode)를 python3에서 사용하지 못했지만 오리 유형을 사용하는 코드는 생존 할 수 있습니다.