본문 바로가기
Computer Science/Python

[파이썬 공식문서] 4. Execution model

by Bloofer 2022. 4. 9.

파이썬 공식 홈페이지 내 Execution model 문서에 정의된 내용을 정리해본다.

1. 프로그램의 구조

파이썬 프로그램의 기본 구성단위는 코드 블럭이다. 여기서 블럭은 파이썬 프로그램 텍스트가 실행되는 단위를 나타내는데, 모듈, 함수 바디, 클래스 정의부 등이 될 수 있다.

 

모든 입력된 인터랙티브한 커맨드는 블럭이 된다. 아래와 같이 말이다.

print('Hello World!') # 하나의 블럭
> Hello World!

 

이러한 코드 블럭은 실행 프레임(Execution frame)에서 실행된다. 프레임은 관리정보 등을 가지고 어디서 어떻게 실행이 이어지고 코드 블럭이 실행된 후에는 어떻게 종료할 것인지를 결정한다. 

 

 

2. 이름과 바인딩 규칙

이름 바인딩하기

파이썬에서 이름(Names)은 오브젝트를 의미한다. 아래와 같은 문법들이 이러한 이름의 바인딩 수행하는데,

  • 함수의 포멀 파라미터
  • 클래스 정의
  • 함수 정의
  • 할당문(Assignment expression)
  • import 문

등이 이에 해당한다.

 

 

바인딩된 이름 풀어내기

위에서 정의한 바인딩 규칙으로 묶어낸 이름들을 파이썬은 실행시간에 다시 풀어내어야 한다. 여기서 필요한 것이 스코프라는 개념이다.

 

스코프란, 블럭안에서 이름의 가시성을 정의한다. 이 말이 무슨 의미이냐면, 지역변수로 정의되어 묶인 이름이던, 전역변수로 정의되어 묶인 이름이던 하나의 실행 범주 안에서 사용하는 이름의 진짜 의미를 풀어내어야 하는데, 그 역할을 하는 것이 스코프이다.

 

파이썬에서 이름이 코드 블럭안에 사용되었을 때, 그것은 그 이름을 가장 인접하게 감싸고있는 스코프를 기준으로 풀어내어진다. 그러한 코드 블럭에서 찾아질 수 있는 스코프들의 집합을 환경(Environment)이라고 한다. 마치 PL 수업내용으로 들어가지는 듯하다.

 

NameError

실행시 이러한 스코프 내에서 이름을 찾지 못했을 때 발생하는 에러가 NameError다. 이름 바인딩이 코드 블럭 안에 어딘가에서 일어난다면, 이것은 정의되기 이전에 사용되는 에러를 발생시킬 수 있다. 이 규칙은 모호한데, 파이썬이 코드 블럭내 어디서든 이름 바인딩이 일어날 수 있도록 허용하기 때문이다.

 

한 예시로 클래스 정의 블록을 들 수 있다. 클래스 정의는 이름을 정의하고 사용할 수 있는 실행가능한(executable) 문이다. 이러한 정의 블록에서 이름 바인딩 규칙은 동일하게 적용되는데, 지역 변수들이 전역 네임스페이스에서 조회되어 찾지 못하는 경우가 발생한다. 더 구체적으로는, 클래스 네임스페이스에 해당하는 스코프의 이름은 클래스 블록에만 해당되고 함수의 코드 블럭까지 확장되지 못한다. 마치 아래 경우처럼 말이다!

 

e.g.) 파이썬 클래스내 정의된 이름의 스코프

class A:
    a = 42
    b = list(a + i for i in range(10))

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in A
File "<stdin>", line 3, in <genexpr>
NameError: name 'a' is not defined

첫번째 코드는 NameError 발생

 

class A:
    a = 42
    b = 10 + a

두번째 코드는 오류없이 실행

 

 

파이썬의 동적 특성

자유 변수에 대한 이름 풀어내기는 컴파일 시간이 아니라 실행 시간에 일어난다. 이 말은 즉슨, 아래 코드는 42를 출력하게 된다는 것이다.

 

e.g.) 파이썬의 동적 특성과 함수의 실행

i = 10
def f():
    print(i)
i = 42
f()

위 코드는 실행시 42를 출력

 

 

3. 예외처리

예외(Exception)란 비정상적인 조건 또는 오류를 처리하기 위해 일반적인 실행흐름을 깨고 발생하는 것을 말한다. 예외는 오류가 감지된 순간에 발생하는데, 일어난 지점의 코드 블럭에 의해 생성된다.

 

파이썬 인터프리터는 런타임 에러를 발생했을 때 예외를 발생시키는데, raise 문을 이용하여 프로그램내 명시적으로 예외를 발생시킬 수도 있다. 파이썬은 종료(termination) 모델을 사용하여 오류를 처리하는데 어떤 오류가 발생했는지 알아내고 외부 수준에서 실행을 계속할 수는 있지만 오류의 원인을 찾아 실패한 작업을 복구할 수는 없다.

 

예외는 또한 클래스 객체로 다루어진다. except문은 클래스 객체에 따라 선택되는데, 객체의 클래스 혹은 객체의 비가상 기본 클래스를 참조해야 한다. 객체는 그렇게 예외 처리기에 추가적인 정보를 전달하여 예외처리 과정을 수행할 수 있게 한다.

 

 

원문: https://docs.python.org/3/reference/executionmodel.html