파이썬 3.11의 새로운 변경사항
2023년 06월 25일
Python
📕 목차
개요
이 글은 파이썬 3.11 버전의 새로운 변경사항을 소개합니다.
Python 3.11 배포 주요 사항
파이썬 3.11 버전은 2022년 10월 24일에 릴리즈 되었습니다.
새로운 기능 (New Features)
PEP 657: Fine-grained error locations in tracebacks
traceback을 출력할때 이제는 에러가 발생한 라인이 아닌 오류를 발생시킨 정확한 표현식을 가리킵니다.
기존에 traceback을 출력할때는 다음과 같이 에러가 발생한 코드의 라인을 출력했습니다.
Traceback (most recent call last):
File "distance.py", line 11, in <module> # 에러가 발생한 라인만 출력
print(manhattan_distance(p1, p2))
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "distance.py", line 6, in manhattan_distance
return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'
위에서 보이는 traceback을 살펴보면 연관된 라인에 ^로 표시가 되어있는 것을 확인할 수 있습니다. 여기서는 어떤 객체가 None인지 모호해서 에러가 정확히 어떤지점에서 발생했는지 알 수가 없었습니다.
Traceback (most recent call last):
File "query.py", line 37, in <module>
magic_arithmetic('foo')
File "query.py", line 18, in magic_arithmetic
return add_counts(x) / 25
^^^^^^^^^^^^^
File "query.py", line 24, in add_counts
return 25 + query_user(user1) + query_user(user2)
^^^^^^^^^^^^^^^^^
File "query.py", line 32, in query_user
return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
~~~~~~~~~~~~~~~~~~^^^^^ # 여기서 ~와 ^이 구문되어 출력되는 것을 볼 수 있습니다.
TypeError: 'NoneType' object is not subscriptable
그리고 복잡한 산술 표현식에서도 이제 어떤 표현식이 오류인지 알 수 있습니다.
Traceback (most recent call last):
File "calculation.py", line 54, in <module>
result = (x / y / z) * (a / b / c)
~~~~~~^~~ # y / z 를 하는 부분에서 에러가 발생
ZeroDivisionError: division by zero
그리고, 이제는 향상된 트레이스백에서 사용된 정보는 general API를 통해서 사용할 수 있습니다. 이 API는 소스 코드의 위치와 바이트코드 명령을 연관시키는데 사용할 수 있습니다.
이 API는 다음과 같습니다.
- 파이썬
codeobject.co_positions()
메서드 - C API
PyCode_Addr2Location()
함수
자세한 내용은 PEP 657을 읽어보시면 좋습니다.
PEP 654: Exception Groups and except*
PEP654에서 프로그램이 동시에 여러개의 연관되지않은 예외들을 다루고 발생시킬 수 있도록 처리하는 새로운 언어 기능이 도입되었습니다. 내장 타입(builtin types)인 ExceptionGroup과 BaseExceptionGroup이 예외를 그룹핑하고 그것들을 함께 발생시키는 것을 가능하게 만들어줬습니다. 그리고 이러한 그룹을 처리하기 위한 새로운 except*
문법을 통해 예외 그룹의 서브 그룹을 매치하는 것을 가능하게 만들어줍니다.
자세한 내용은 PEP 654를 읽어보시면 좋습니다.