source

Python에서 변수가 사전인지 확인하는 방법은 무엇입니까?

factcode 2022. 11. 16. 21:25
반응형

Python에서 변수가 사전인지 확인하는 방법은 무엇입니까?

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또는 만약 당신이 하위 분류를 했다면 효과가 있었을 것이다.dict:

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

Python에서 변수가 사전인지 어떤지를 어떻게 확인하시겠습니까?

이것은 훌륭한 질문입니다만, 유감스럽게도 가장 높은 표를 얻은 답변은 추천이 불충분합니다.type(obj) is dict.

(또,dict변수 이름으로 지정합니다.기본 객체의 이름입니다.)

다른 사용자가 Import하여 사용하는 코드를 기술할 경우, 사용자가 직접 dict builtin을 사용할 것으로 추측하지 마십시오.이 경우 코드를 더 유연하지 않게 하고 프로그램을 오류 발생시키지 않는 쉽게 숨겨진 버그를 만듭니다.

향후 사용자를 위한 정확성, 유지보수성 및 유연성을 위해 보다 유연하고 관용적인 표현이 있을 경우 코드에 덜 유연하고 비자동적인 표현을 사용할 것을 강력히 권장합니다.

is오브젝트 ID 테스트입니다.상속도 지원되지 않고 추상화도 지원되지 않으며 인터페이스도 지원되지 않습니다.

몇 가지 옵션을 제시하겠습니다.

지원 상속:

이것은 사용자가 자신의 서브클래스인 dict를 제공할 수 있기 때문에 제가 제안하는 첫 번째 권장 사항입니다.OrderedDict,defaultdict, 또는Counter다음 명령어를 사용합니다.

if isinstance(any_object, dict):

하지만 훨씬 더 유연한 옵션이 있습니다.

지원 추상화:

from collections.abc import Mapping

if isinstance(any_object, Mapping):

이를 통해 코드 사용자는 추상 매핑의 사용자 정의 구현을 사용할 수 있습니다. 추상 매핑은 다음 하위 클래스도 포함합니다.dict올바른 동작을 얻을 수 있습니다.

인터페이스 사용

OOP 어드바이스는 일반적으로 "program to a interface"라고 합니다.

이 전략은 Python의 다형성 또는 오리 타이핑을 활용합니다.

그 때문에, 인터페이스에의 액세스를 시도하고, 예상되는 특정의 에러를 검출합니다( ).AttributeError없는 경우에 대비해서.items그리고.TypeError경우에.items적절한 폴백을 수반하는 콜 불능) - 이제 해당 인터페이스를 구현하는 클래스는 해당 항목을 제공합니다(주의)..iteritems()Python 3) python python python python python python python python python python python python 。

try:
    items = any_object.items()
except (AttributeError, TypeError):
    non_items_behavior(any_object)
else: # no exception raised
    for item in items: ...

이와 같은 duck-type을 사용하는 것은 너무 많은 false positive를 허용하기 때문에 이 코드의 목적에 따라서는 너무 많은 false positive를 허용할 수 있다고 생각할 수 있습니다.

결론

마세요is표준 제어 흐름의 유형을 확인합니다.isinstance, 하다, 하다, 하다와 같은 을 고려합니다.Mapping ★★★★★★★★★★★★★★★★★」MutableMapping인터페이스를 직접 사용하여 타입 체크를 회피하는 것을 검토해 주십시오.

python 3.6에서는

    typeVariable = type(variable)
    
    print('comparison',typeVariable == dict)

    if typeVariable == dict:
        #'true'
    else:
        #'false'

테스트 결과 다음과 같은 유형의 힌트가 있습니다.

from typing import Dict

if isinstance(my_dict, Dict):
    # True
else:
    # False

타이핑에 대한 몇 가지 설명을 곁들이겠습니다.여기서 받아쓰기

OP는 시작 변수를 제외하지 않았으므로, 여기서 완전성을 위해 항목을 사전으로 포함할 수 있는 가정된 사전을 처리하는 일반적인 경우를 처리하는 방법을 설명합니다.

또한 Python(3.8)이 권장하는 사전 테스트 방법을 위의 코멘트에 따릅니다.

from collections.abc import Mapping

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

def parse_dict(in_dict): 
    if isinstance(in_dict, Mapping):
        for k_outer, v_outer in in_dict.items():
            if isinstance(v_outer, Mapping):
                for k_inner, v_inner in v_outer.items():
                    print(k_inner, v_inner)
            else:
                print(k_outer, v_outer)

parse_dict(my_dict)

언급URL : https://stackoverflow.com/questions/25231989/how-to-check-if-a-variable-is-a-dictionary-in-python

반응형