2011-08-01 3 views
3

문제점 : 반환 값이 파이썬 사전인지 확인해야합니다.Python에서 객체 유형을 올바르게 검사하는 방법은 무엇입니까?

Q1. 다음 중 올바른 방법은 무엇입니까?

type(x) == dict 

type(x) == type(dict) 

isinstance(d, dict) 

그럼 대신 ==is 연산자를 이용하여 다른 변형들이있다.

2. Many people은 객체의 유형을 검사하는 것은 일반적으로 나쁜 습관이라고 말하지만 초기 문제와 관련하여 다른 선택의 여지가 있습니까? 오히려 종류를 확인하는 것보다 __getitem__에 대한

+0

당신이 사전에 할 필요하거나 당신이 그것에 항목에 액세스해야합니까? – GaretJax

+0

그리고 어쨌든, 당신이 링크 한 질문은 이미 답을 제공합니다. – GaretJax

+0

@Garet 다른 사전을 업데이트 할 때 사용하기 때문에 사전이되어야합니다. – Paolo

답변

8

l1. 다음 중 올바른 방법은 무엇입니까?

유형 검사에 시간을 낭비하지 마십시오. 이 가정을 기반으로하기 때문에

그것은 오류가 발생하기 쉬운입니다.

질문 2. ... 다른 선택의 여지가 있습니까?

예 이렇게하십시오.

try: 
    x.the_dict_operation() 
except TypeError: 
    # x was not the expected type for the operation 
    raise # or whatever. 

대부분의 경우 "아무 것도하지 않음"입니다.

코드를 작성하십시오. 악의적 인 사회 병사가 "어쨌든"잘못된 유형을 사용하면 예상대로 작동하지 않습니다.

+0

+1 큰 감사, 지금 나는 "Duck typing"이 무엇인지에 대해 정말로 이해하고 있습니다. – Paolo

+0

이 방법은 x.the_dict_operation 메서드가 여전히 수행해야 할 작업을 수행한다고 믿어야합니다 (제 경우에는 다른 사전의 일반 .update). 이것이 잠재적 인 문제가 아닌가? – Paolo

+0

@Guandalino : 사용자가 제공 한 dict를 사용하여 자신의 dict을 업데이트하고 있으므로, 사용자 자신의 dict의'.update()'메소드가 호출됩니다. 믿을 수 없다면 ... – kindall

1

확인합니다. 실제로 유형 검사를 원할 경우 아무 것도 괜찮습니다 (type(x) == type(dict) 제외). 이는 dict 인스턴스의 경우 절대로 적용되지 않습니다. isinstance이 아마도 가장 표준적인 방법 일 것입니다.

+0

'__getitem__'은 dict와 아무 관련이 없습니다. 많은 객체는 dicts가 아닌'__getitem__'을 가지고 있습니다. 그가 무엇을하고 있는지 (객체가'{} .update'에 전달 될 수 있는지를 검사 할 때), 이것은 특히 잘못되었습니다 :'__getitem__'을 가지지 않는 함수로 전달 될 수있는 객체가 있습니다. 그는 객체가 반복 가능한지를 확인하려고합니다. –

+0

@Glenn iterated-over 요소가 각각 iterable이어서 각 요소에 2 개의 요소가 있도록 반복 가능해야합니다. :) –

2

동작에 의뢰하십시오. 실제 유형이 아닙니다 (다른 답변 참조).

많은 오브젝트가 사전처럼 작동 할 수 있지만, 함수/API 사용자가 일반 dicts를 사용하도록 강요하고 싶지는 않습니까?

실용적인 측면에서

:

>>> type({}) 
<type 'dict'> 
>>> dict 
<type 'dict'> 
>>> type(dict) 
<type 'type'> 
>>> isinstance({}, dict) 
True 
>>> isinstance("", dict) 
False 
관련 문제