[python] 파이썬에서 변수가 사전인지 확인하는 방법?

파이썬에서 변수가 사전인지 어떻게 확인합니까?

예를 들어, 사전을 찾을 때까지 사전의 값을 반복하고 싶습니다. 그런 다음 찾은 것을 반복하십시오.

dict = {'abc': 'abc', 'def': {'ghi': 'ghi', 'jkl': 'jkl'}}
for k, v in dict.iteritems():
    if ###check if v is a dictionary:
        for k, v in v.iteritems():
            print(k, ' ', v)
    else:
        print(k, ' ', v)



답변

서브 클래스 화 한 경우 작동 if type(ele) is dict하거나 사용할 수 있습니다 .isinstance(ele, dict)dict

d = {'abc':'abc','def':{'ghi':'ghi','jkl':'jkl'}}
for ele in d.values():
    if isinstance(ele,dict):
       for k, v in ele.items():
           print(k,' ',v)


답변

파이썬에서 변수가 사전인지 어떻게 확인합니까?

이것은 훌륭한 질문이지만 가장 유력한 답변이 잘못된 추천으로 이어진다는 것은 불행한 일 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, 피하는 고려 유형 검사, 모두 직접 인터페이스를 사용하여.


답변

OP는 시작 변수를 제외하지 않았으므로 완전성을 위해 항목을 사전으로 포함 할 수있는 사전을 처리하는 일반적인 경우를 처리하는 방법이 있습니다.

또한 위의 주석에서 사전을 테스트 하는 순수한 Python (3.8) 권장 방법 을 따르십시오 .

from collections.abc import Mapping

dict = {'abc': 'abc', 'def': {'ghi': 'ghi', 'jkl': 'jkl'}}

def parse_dict(in_dict):
    if isinstance(in_dict, Mapping):
        for k, v in in_dict.items():
            if isinstance(v, Mapping):
                for k, v in v.items():
                    print(k, v)
            else:
                print(k, v)

parse_dict(dict)


답변