Python의 선택적 연결
-
try-except
를 사용하여 Python에서 선택적 연결 구현 -
getattr
을 사용하여 Python에서 선택적 연결 구현 -
get(key, value)
를 사용하여 Python에서 선택적 연결 구현 - 메서드 조합을 사용하여 Python에서 선택적 연결 구현
-
getattr
을 드롭인으로 사용하여 Python에서 선택적 연결 구현 -
glom
을 사용하여 Python에서 선택적 연결 구현 - 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
는 명령을 프로그램에 전달할 때 발생하는 오류를 처리하는 데 사용되는 문으로 구성됩니다.
프로그램이 실행될 때 예외가 발생할 수 있습니다. 그런 다음 오류와 발생 방식을 표시하는 메시지를 인쇄하여 프로그램을 중단합니다.
중단을 방지하려면 그들을 잡아야 합니다. 따라서 이와 같은 예외 처리는 오류 방지 코드를 얻는 데 도움이 됩니다.
여기서 우리는 NameError
및 AttributeError
라는 두 가지 주요 오류를 고려하고 있습니다. 정의되지 않은 변수나 함수를 사용할 때 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'}}
는 사전이며 이를 통해 key
및 value
와 함께 두 개의 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
기능이 두 개의 매개변수로 정의됩니다.
그런 다음 try
및 except
컨트롤을 사용하여 처음 논의된 방법을 적용할 수 있습니다. try
및 except
명령 내에서 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
함수를 드롭인으로 정의합니다.
경로가 존재하지 않으면 rgetattr
는 AttributeError
를 발생시키고 None
대신 기본값을 지정할 수 있습니다.
glom
을 사용하여 Python에서 선택적 연결 구현
옵셔널 체이닝에서 사용할 수 있는 또 다른 방법은 glom
을 사용하는 것입니다.
from glom import glom
target = {"a": {"b": {"c": "d"}}}
glom(target, "a.b.c", default=None)
첫 번째 단계로 라이브러리에서 glom
모듈을 가져와야 합니다. 그런 다음 a, b,
및 c
가 포함된 사전 형식으로 대상이 정의되었습니다. 또한 d
는 c
에 해당하는 값입니다.
그 후, glom
함수가 target
및 a.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에서 선택적 연결이 필요할 때 적응할 수 있는 방법입니다.
우리가 해결하는 프로세스 및 성능 문제를 알고 있는 경우 try
및 except
접근 방식을 사용하고 조기 최적화를 피할 수 있습니다. 또한 getattr
을 사용하여 코드를 반영할 수 있습니다.
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.