Python의 선택적 연결

Migel Hewage Nimesha 2023년6월21일
  1. try-except를 사용하여 Python에서 선택적 연결 구현
  2. getattr을 사용하여 Python에서 선택적 연결 구현
  3. get(key, value)를 사용하여 Python에서 선택적 연결 구현
  4. 메서드 조합을 사용하여 Python에서 선택적 연결 구현
  5. getattr을 드롭인으로 사용하여 Python에서 선택적 연결 구현
  6. glom을 사용하여 Python에서 선택적 연결 구현
  7. Python에서 선택적 연결을 구현하기 위해 사전 및 객체와 함께 읽기 가능한 메서드 사용
  8. 결론
Python의 선택적 연결

Python은 주로 시스템 스크립팅, 서버 측 웹 개발 및 소프트웨어 개발에 사용되는 프로그래밍 언어입니다. 또한 코드의 가독성을 높이는 간단한 구문으로 구성되어 있습니다.

Python의 기능 중 선택적 연결은 중첩된 개체 속성에 액세스하는 안전하고 간결한 방법입니다. 당시에 null이거나 null이 아닐 수 있는 속성을 호출하고 쿼리하는 프로세스입니다.

옵셔널 체이닝을 사용하면 수동으로 확인하는 대신 객체의 속성이 사용 가능한지 내부적으로 확인할 수 있습니다.

선택적 연결은 연산자에 남겨진 속성이 정의되었는지 또는 정의되지 않았는지 확인합니다. 속성이 null이 아닌 경우 호출이 성공하고 유효하지 않거나 정의되지 않은 경우 undefined를 반환합니다.

여기서는 오류를 보고하는 대신 정의되지 않은 값을 반환합니다. 또한 메서드가 존재하지 않더라도 함수 호출에서 잘 작동합니다.

이 개념은 Claude Pache, Gabriel Isenberg, Daniel Rosenwasser 및 Dustin Savery가 저술한 ECMA International, Technical Committee 39 – ECMAScript에 의해 최근 소개되었습니다.

깔끔한 코드를 작성할 때 옵셔널 체이닝은 사용하기 좋은 기능입니다.

다음은 Python에서 선택적 연결을 구현하는 데 사용할 수 있는 몇 가지 방법입니다. 함수를 빌드할 때 이러한 코드 청크를 사용할 수 있습니다.

try-except를 사용하여 Python에서 선택적 연결 구현

선택적 연결의 가장 파이썬적인 방법은 다음과 같습니다.

try:
    # statements

except (NameError, AttributeError) as e:
    # statements (else)

이 방법은 try 명령과 except 명령을 사용합니다. try에는 흐름을 제어하는 데 사용되는 문이 포함되며 except는 명령을 프로그램에 전달할 때 발생하는 오류를 처리하는 데 사용되는 문으로 구성됩니다.

프로그램이 실행될 때 예외가 발생할 수 있습니다. 그런 다음 오류와 발생 방식을 표시하는 메시지를 인쇄하여 프로그램을 중단합니다.

중단을 방지하려면 그들을 잡아야 합니다. 따라서 이와 같은 예외 처리는 오류 방지 코드를 얻는 데 도움이 됩니다.

여기서 우리는 NameErrorAttributeError라는 두 가지 주요 오류를 고려하고 있습니다. 정의되지 않은 변수나 함수를 사용할 때 NameError가 발생할 수 있습니다.

사용자가 잘못된 속성 참조를 시도하면 참조가 실패하고 AttributeError가 발생할 수 있습니다. 또한 철자 변형은 AttributeError로 발생합니다.

위에서 논의한 바와 같이 선택적 연결의 파이썬 접근 방식은 속성이 정의되었는지 여부에 관계없이 예외를 처리하는 동안 속성을 호출하는 데 도움이 됩니다.

getattr을 사용하여 Python에서 선택적 연결 구현

위의 방법 대신 getattr을 사용하는 것도 선택적 연결의 또 다른 방법입니다.

getattr(getattr(foo, "bar", None), "baz", None)

여기서는 지정된 객체에서 명명된 속성 값을 반환하는 getattr 함수를 사용합니다. 개체 이름은 문자열이어야 하며 명명된 속성인 경우 해당 속성의 값을 반환합니다.

그러나 명명된 속성이 존재하지 않는 경우 기본값이 반환되거나 AttributeError가 발생합니다.

getattr 함수 내에서 getattr(foo, 'bar', None)은 객체이고 baz는 속성이고 None은 기본값입니다.

get(key, value)를 사용하여 Python에서 선택적 연결 구현

사전일 때 get(key, value)를 사용할 수 있습니다.

{"foo": {"bar": "baz"}}.get("foo", {}).get("bar")

사전은 key: value 쌍으로 저장된 정렬되고 변경 가능하며 중복되지 않는 데이터 값의 모음입니다. 여기서 'foo', 'bar''baz'는 Python에서 사용하는 자리 표시자입니다.

{'foo': {'bar': 'baz'}}는 사전이며 이를 통해 keyvalue와 함께 두 개의 get 함수를 사용합니다. 여기서 get 함수는 지정된 키로 항목의 값을 반환합니다.

첫 번째 get 함수는 'foo' 키와 {} 값으로 구성되는 반면 두 번째 get 기능은 'bar' 키로만 구성됩니다.

위의 코드 조각에서와 같이 사전을 사용할 때도 선택적 연결 개념을 적용할 수 있습니다.

메서드 조합을 사용하여 Python에서 선택적 연결 구현

다음은 옵셔널 체이닝에서 따를 수 있는 또 다른 방법입니다. 방법의 조합입니다.

from functools import reduce


def optional_chain(obj, keys):
    try:
        reduce(getattr, keys.split("."), root)
    except AttributeError:
        return None


optional_chain(foo, "bar.baz")

처음에는 중간 결과를 저장하고 최종 합계만 반환하는 functools에서 reduce 모듈을 가져와야 합니다. 그런 다음 optional_chain 기능이 두 개의 매개변수로 정의됩니다.

그런 다음 tryexcept 컨트롤을 사용하여 처음 논의된 방법을 적용할 수 있습니다. tryexcept 명령 내에서 getattr 기능을 사용했습니다.

두 번째 방법에서 getattr의 기능을 설명했습니다. 마지막으로 두 개의 매개변수를 정의하여 optional_chain을 호출합니다.

getattr을 드롭인으로 사용하여 Python에서 선택적 연결 구현

위와 같이 getattr을 확장하지 않고 드롭인으로 사용할 수 있습니다.

from functools import reduce


def rgetattr(obj, attr, *args):
    def _getattr(obj, attr):
        return getattr(obj, attr, *args)

    return reduce(_getattr, attr.split("."), obj)

모듈을 가져온 후 세 개의 매개변수를 사용하여 rgetattr라는 함수를 정의했습니다. 그런 다음 getattr 함수를 드롭인으로 정의합니다.

경로가 존재하지 않으면 rgetattrAttributeError를 발생시키고 None 대신 기본값을 지정할 수 있습니다.

glom을 사용하여 Python에서 선택적 연결 구현

옵셔널 체이닝에서 사용할 수 있는 또 다른 방법은 glom을 사용하는 것입니다.

from glom import glom

target = {"a": {"b": {"c": "d"}}}
glom(target, "a.b.c", default=None)

첫 번째 단계로 라이브러리에서 glom 모듈을 가져와야 합니다. 그런 다음 a, b,c가 포함된 사전 형식으로 대상이 정의되었습니다. 또한 dc에 해당하는 값입니다.

그 후, glom 함수가 targeta.b.c와 함께 호출되었습니다. 예외가 발생하면 None이 기본값으로 인쇄됩니다.

Python에서 선택적 연결을 구현하기 위해 사전 및 객체와 함께 읽기 가능한 메서드 사용

아래 방법을 적용하면 사전 및 개체와 함께 사용할 때 코드를 더 읽기 쉽게 만들 수 있습니다.

def optional_chain(root, *keys):
    result = root
    for k in keys:
        if isinstance(result, dict):
            result = result.get(k, None)
        else:
            result = getattr(result, k, None)
        if result is None:
            break
    return result

처음에는 optional_chain이라는 함수를 정의하고 for 루프와 if-else 문으로 진행했습니다. 흐름 내에서 getattr 함수를 사용하여 else 부분에서 결과를 얻었습니다.

이 함수를 사용할 때 첫 번째 인수 뒤에 keys를 추가해야 합니다.

obj = {"a": {"b": {"c": {"d": 1}}}}
print(optional_chain(obj, "a", "b"), optional_chain(obj, "a", "z"))

결론

전반적으로 위의 방법은 Python에서 선택적 연결이 필요할 때 적응할 수 있는 방법입니다.

우리가 해결하는 프로세스 및 성능 문제를 알고 있는 경우 tryexcept 접근 방식을 사용하고 조기 최적화를 피할 수 있습니다. 또한 getattr을 사용하여 코드를 반영할 수 있습니다.

Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.