파이썬에서 변수가 사전인지 어떻게 확인합니까?
이것은 훌륭한 질문이지만 가장 유력한 답변이 잘못된 추천으로 이어진다는 것은 불행한 일 type(obj) is dict
입니다.
( dict
변수 이름으로 도 사용해서는 안됩니다 . 내장 객체의 이름입니다.)
다른 사람이 가져 와서 사용할 코드를 작성하는 경우 직접 내장 된 dict을 사용한다고 가정하지 마십시오. 추정으로 인해 코드가 더 융통성이 없어지고이 경우 프로그램을 오류로 만들지 않는 숨겨진 버그를 쉽게 만들 수 있습니다. .
보다 유연하고 관용적 인 표현이있을 때 코드에서 유연하고 일관적인 표현을하지 않는 미래의 사용자를위한 정확성, 유지 관리 성 및 유연성을 위해 강력히 제안합니다.
is
객체 식별 테스트입니다 . 상속을 지원하지 않으며 추상화를 지원하지 않으며 인터페이스를 지원하지 않습니다.
그래서 몇 가지 옵션을 제공 할 것입니다.
상속 지원 :
사용자가 자신의 DICT의 서브 클래스, 또는 공급하는 것이 할 수 있기 때문에, 내가 만드는 것이 첫 번째 추천 OrderedDict
, defaultdict
또는 Counter
컬렉션이 모듈을 :
if isinstance(any_object, dict):
그러나 더 유연한 옵션이 있습니다.
지원 추상화 :
from collections.abc import Mapping
if isinstance(any_object, Mapping):
이를 통해 코드 사용자는의 하위 클래스를 포함하는 추상 매핑의 자체 사용자 지정 구현을 사용 dict
하고 여전히 올바른 동작을 얻을 수 있습니다.
인터페이스를 사용하십시오
일반적으로 OOP 조언, "인터페이스 프로그램"을들을 수 있습니다.
이 전략은 파이썬의 다형성 또는 오리 타이핑을 활용합니다.
따라서 합리적인 폴백으로 인터페이스에 액세스하여 특정 예상 오류 ( AttributeError
없음 .items
및 호출 할 수없는 TypeError
경우 items
)를 잡으십시오.이 인터페이스를 구현하는 모든 클래스는 항목을 제공합니다 ( .iteritems()
Python에서 사라졌습니다) 삼):
try:
items = any_object.items()
except (AttributeError, TypeError):
non_items_behavior(any_object)
else: # no exception raised
for item in items: ...
아마도 이와 같은 덕 타이핑을 사용하면 너무 많은 오 탐지를 허용하는 데 너무 멀리 가고 있다고 생각할 수도 있습니다.이 코드의 목표에 따라 다를 수 있습니다.
결론
is
표준 제어 흐름 유형을 확인 하는 데 사용하지 마십시오 . 사용은 isinstance
같은 추상화 고려 Mapping
또는 MutableMapping
, 피하는 고려 유형 검사, 모두 직접 인터페이스를 사용하여.