Python Language Reference > 4. Execution model

4.1. Structure of a program

Python 프로그램은 코드 블록으로 구성됩니다. 블록은 하나의 단위로 실행되는 Python 프로그램 텍스트 조각입니다. 다음은 모듈, 함수 본문 및 클래스 정의와 같은 블록입니다. 대화식으로 입력되는 각 명령은 블록입니다. 스크립트 파일(인터프리터에 표준 입력으로 제공되거나 인터프리터에 명령줄 인수로 지정된 파일)은 코드 블록입니다. 스크립트 명령(-c 옵션을 사용하여 인터프리터 명령줄에 지정된 명령)은 코드 블록입니다. -m 인수를 사용하여 명령줄에서 최상위 수준 스크립트(모듈 __main__)로 실행되는 모듈도 코드 블록입니다. 내장 함수 eval() 및 exec()에 전달되는 문자열 인수는 코드 블록입니다.

코드 블록은 실행 프레임에서 실행됩니다. 프레임에는 일부 관리 정보(디버깅에 사용됨)가 포함되어 있으며 코드 블록의 실행이 완료된 후 실행이 계속되는 위치와 방법을 결정합니다.

4.2. Naming and binding

4.2.1. Binding of names

이름은 개체를 나타냅니다. 이름은 이름 바인딩 작업을 통해 도입됩니다.

다음 구성은 이름을 바인드합니다:

  • 함수에 대한 공식 매개변수,
  • 클래스 정의,
  • 함수 정의,
  • 대입 표현,
  • 할당에서 발생하는 경우 식별자인 대상:
    • for 루프 헤더,
    • with 문, except 절, except* 절 또는 구조적 패턴 일치의 as-pattern에서 as 뒤에,
    • 구조적 패턴 일치의 캡처 패턴에서
  • import 문

from … import * 형식의 import 문은 밑줄로 시작하는 이름을 제외하고 가져온 모듈에 정의된 모든 이름을 바인딩합니다. 이 양식은 모듈 수준에서만 사용할 수 있습니다.

del 문에서 발생하는 대상도 이 목적을 위해 바인딩된 것으로 간주됩니다(실제 시맨틱은 이름을 바인딩 해제하는 것임).

각 할당 또는 가져오기 문은 클래스 또는 함수 정의에 의해 정의된 블록 내에서 또는 모듈 수준(최상위 코드 블록)에서 발생합니다.

이름이 블록에 바인딩되어 있으면 비지역 또는 전역으로 선언되지 않는 한 해당 블록의 지역 변수입니다. 이름이 모듈 수준에서 바인딩되면 전역 변수입니다. (모듈 코드 블록의 변수는 지역 변수와 전역 변수입니다.) 변수가 코드 블록에서 사용되지만 정의되지 않은 경우 자유 변수입니다.

프로그램 텍스트에 나오는 각 이름은 다음 이름 확인 규칙에 의해 설정된 해당 이름의 바인딩을 나타냅니다.

4.2.2. Resolution of names

범위는 블록 내에서 이름의 가시성을 정의합니다. 지역 변수가 블록에 정의된 경우 해당 범위에는 해당 블록이 포함됩니다. 함수 블록에서 정의가 발생하는 경우 포함된 블록이 이름에 대해 다른 바인딩을 도입하지 않는 한 범위는 정의 블록 내에 포함된 모든 블록으로 확장됩니다.

코드 블록에서 이름이 사용되면 가장 가까운 둘러싸는 범위를 사용하여 확인됩니다. 코드 블록에 표시되는 이러한 모든 범위 집합을 블록의 환경이라고 합니다.

이름을 전혀 찾을 수 없으면 NameError 예외가 발생합니다. 현재 범위가 함수 범위이고 이름이 사용된 지점에서 아직 값에 바인딩되지 않은 지역 변수를 이름이 참조하는 경우 UnboundLocalError 예외가 발생합니다. UnboundLocalError는 NameError의 하위 클래스입니다.

코드 블록 내 어디에서나 이름 바인딩 작업이 발생하면 블록 내에서 이름을 사용하는 모든 것이 현재 블록에 대한 참조로 처리됩니다. 이로 인해 바인딩되기 전에 블록 내에서 이름이 사용될 때 오류가 발생할 수 있습니다. 이 규칙은 미묘합니다. Python에는 선언이 없으며 이름 바인딩 작업이 코드 블록 내 어디에서나 발생할 수 있습니다. 코드 블록의 로컬 변수는 이름 바인딩 작업을 위해 블록의 전체 텍스트를 스캔하여 확인할 수 있습니다. 예제는 UnboundLocalError에 대한 FAQ 항목을 참조하십시오.

전역 문이 블록 내에서 발생하는 경우 문에 지정된 이름의 모든 사용은 최상위 네임스페이스에서 해당 이름의 바인딩을 참조합니다. 이름은 전역 네임스페이스, 즉 코드 블록을 포함하는 모듈의 네임스페이스와 내장 모듈의 네임스페이스인 내장 네임스페이스를 검색하여 최상위 네임스페이스에서 확인됩니다. 전역 네임스페이스가 먼저 검색됩니다. 거기에 이름이 없으면 builtins 네임스페이스가 검색됩니다. global 문은 나열된 이름의 모든 사용에 선행해야 합니다.

전역 문은 동일한 블록의 이름 바인딩 작업과 동일한 범위를 갖습니다. 자유 변수에 대한 가장 가까운 둘러싸는 범위에 전역 문이 포함된 경우 자유 변수는 전역으로 처리됩니다.

nonlocal 문은 해당 이름이 가장 가까운 둘러싸는 함수 범위에서 이전에 바인딩된 변수를 참조하도록 합니다. SyntaxError 는 주어진 이름이 둘러싸는 함수 범위에 존재하지 않으면 컴파일 타임에 발생합니다.

모듈의 네임스페이스는 모듈을 처음 가져올 때 자동으로 생성됩니다. 스크립트의 기본 모듈은 항상 __main__이라고 합니다.

exec() 및 eval()에 대한 클래스 정의 블록 및 인수는 이름 확인 컨텍스트에서 특별합니다. 클래스 정의는 이름을 사용하고 정의할 수 있는 실행 가능한 명령문입니다. 이러한 참조는 바인딩되지 않은 로컬 변수가 전역 네임스페이스에서 조회된다는 점을 제외하고 이름 확인에 대한 일반적인 규칙을 따릅니다. 클래스 정의의 네임스페이스는 클래스의 속성 사전이 됩니다. 클래스 블록에 정의된 이름의 범위는 클래스 블록으로 제한됩니다. 메서드의 코드 블록으로 확장되지 않습니다. 여기에는 함수 범위를 사용하여 구현되기 때문에 내포 및 생성기 표현식이 포함됩니다. 이는 다음이 실패함을 의미합니다.

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

4.2.3. Builtins and restricted execution

CPython 구현 세부 사항: 사용자는 __builtins__를 건드리면 안 됩니다. 엄격하게 구현 세부 사항입니다. builtins 네임스페이스의 값을 재정의하려는 사용자는 builtins 모듈을 가져와 해당 속성을 적절하게 수정해야 합니다.

코드 블록의 실행과 관련된 내장 네임스페이스는 실제로 전역 네임스페이스에서 __builtins__라는 이름을 검색하여 찾을 수 있습니다. 이것은 사전 또는 모듈이어야 합니다(후자의 경우 모듈의 사전이 사용됨). 기본적으로 __main__ 모듈에 있을 때 __builtins__는 내장 모듈 내장입니다. 다른 모듈에 있을 때 __builtins__는 내장 모듈 자체의 사전에 대한 별칭입니다.

4.2.4. Interaction with dynamic features

자유 변수의 이름 확인은 컴파일 타임이 아니라 런타임에 발생합니다. 즉, 다음 코드는 42를 인쇄합니다.

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

eval() 및 exec() 함수는 이름을 확인하기 위한 전체 환경에 액세스할 수 없습니다. 호출자의 로컬 및 전역 네임스페이스에서 이름을 확인할 수 있습니다. 자유 변수는 가장 가까운 둘러싸는 네임스페이스에서 해결되지 않고 전역 네임스페이스에서 해결됩니다. exec() 및 eval() 함수에는 전역 및 로컬 이름 공간을 재정의하는 선택적 인수가 있습니다. 하나의 네임스페이스만 지정된 경우 둘 다에 사용됩니다.

4.3. Exceptions

예외는 오류 또는 기타 예외 조건을 처리하기 위해 코드 블록의 정상적인 제어 흐름에서 벗어나는 수단입니다. 오류가 감지된 지점에서 예외가 발생합니다. 주변 코드 블록 또는 오류가 발생한 코드 블록을 직간접적으로 호출한 코드 블록에 의해 처리될 수 있습니다.

Python 인터프리터는 런타임 오류(예: 0으로 나누기)를 감지하면 예외를 발생시킵니다. Python 프로그램은 raise 문을 사용하여 명시적으로 예외를 발생시킬 수도 있습니다. 예외 처리기는 try … except 문으로 지정됩니다. 이러한 문의 finally 절은 예외를 처리하지 않지만 이전 코드에서 예외가 발생했는지 여부에 관계없이 실행되는 정리 코드를 지정하는 데 사용할 수 있습니다.

파이썬은 오류 처리의 “종료” 모델을 사용합니다. 예외 처리기는 무슨 일이 일어났는지 알아내고 외부 수준에서 실행을 계속할 수 있지만 오류의 원인을 복구하고 실패한 작업을 다시 시도할 수는 없습니다(문제가 되는 조각을 다시 입력하는 경우 제외). 상단의 코드).

예외가 전혀 처리되지 않으면 인터프리터는 프로그램 실행을 종료하거나 대화형 메인 루프로 돌아갑니다. 두 경우 모두 예외가 SystemExit인 경우를 제외하고는 스택 트레이스백을 인쇄합니다.

예외는 클래스 인스턴스로 식별됩니다. except 절은 인스턴스의 클래스에 따라 선택됩니다. 인스턴스의 클래스 또는 가상이 아닌 기본 클래스를 참조해야 합니다. 인스턴스는 핸들러에서 수신할 수 있으며 예외 조건에 대한 추가 정보를 전달할 수 있습니다.

참고: 예외 메시지는 Python API의 일부가 아닙니다. 그 내용은 경고 없이 Python의 한 버전에서 다음 버전으로 변경될 수 있으며 여러 버전의 인터프리터에서 실행되는 코드에 의존해서는 안 됩니다.

또한 try 문 섹션에 있는 try 문 및 raise 문 섹션raise 문에 대한 설명을 참조하십시오.

Source: https://docs.python.org/3/reference/executionmodel.html