Python Built-in Types 1/2

다음 섹션에서는 인터프리터에 내장된 표준 유형에 대해 설명합니다.

주요 기본 제공 유형은 숫자, 시퀀스, 매핑, 클래스, 인스턴스 및 예외입니다.

일부 컬렉션 클래스는 변경 가능합니다. 멤버를 제자리에 추가, 빼기 또는 재정렬하고 특정 항목을 반환하지 않는 메서드는 컬렉션 인스턴스 자체를 반환하지 않고 None을 반환합니다.

일부 작업은 여러 개체 유형에서 지원됩니다. 특히 거의 모든 객체가 동일한지 비교하고, 진리값을 테스트하고, 문자열로 변환할 수 있습니다(repr() 함수 또는 약간 다른 str() 함수 사용). 후자의 함수는 객체가 print() 함수에 의해 기록될 때 암시적으로 사용됩니다.

Truth Value Testing

모든 개체는 if 또는 while 조건에서 사용하거나 아래 부울 연산의 피연산자로 사용하기 위해 진리값에 대해 테스트할 수 있습니다.

기본적으로 객체와 함께 호출될 때 해당 클래스가 False를 반환하는 __bool__() 메서드 또는 0을 반환하는 __len__() 메서드를 정의하지 않는 한 객체는 참으로 간주됩니다. 1 거짓으로 간주되는 대부분의 내장 개체는 다음과 같습니다.

  • false로 정의된 상수: None 및 False.
  • 모든 숫자 유형의 0: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)
  • 빈 시퀀스 및 컬렉션: ”, (), [], {}, set(), range(0)

부울 결과가 있는 연산 및 내장 함수는 달리 명시되지 않는 한 항상 거짓이면 0 또는 False, 참이면 1 또는 True를 반환합니다. (중요한 예외: 부울 연산 or and and는 항상 피연산자 중 하나를 반환합니다.)

Boolean Operations — andornot

우선 순위가 오름차순으로 정렬된 부울 연산은 다음과 같습니다.

OperationResultNotes
x or yif x is false, then y, else x(1)
x and yif x is false, then x, else y(2)
not xif x is false, then True, else False(3)

노트:

  1. 이것은 단락 연산자이므로 첫 번째 인수가 거짓인 경우에만 두 번째 인수를 평가합니다.
  2. 이것은 단락 연산자이므로 첫 번째 인수가 참인 경우에만 두 번째 인수를 평가합니다.
  3. not은 부울이 아닌 연산자보다 우선 순위가 낮으므로 not a == b는 not(a == b)으로 해석되고 a == not b는 구문 오류입니다.

Comparisons

파이썬에는 8개의 비교 연산이 있습니다. 그것들은 모두 동일한 우선순위를 가집니다(부울 연산보다 높음). 비교는 임의로 연결할 수 있습니다. 예를 들어, x < y <= z는 y가 한 번만 평가된다는 점을 제외하고 x < y 및 y <= z와 동일합니다(그러나 두 경우 모두 x < y가 거짓인 경우 z는 전혀 평가되지 않습니다).

이 표에는 비교 작업이 요약되어 있습니다.

OperationMeaning
<strictly less than
<=less than or equal
>strictly greater than
>=greater than or equal
==equal
!=not equal
isobject identity
is notnegated object identity

다른 숫자 유형을 제외하고 다른 유형의 객체는 결코 동일하게 비교되지 않습니다. == 연산자는 항상 정의되지만 일부 개체 유형(예: 클래스 개체)의 경우 is와 동일합니다. <, <=, > 및 >= 연산자는 의미가 있는 경우에만 정의됩니다. 예를 들어 인수 중 하나가 복소수일 때 TypeError 예외를 발생시킵니다.

클래스의 동일하지 않은 인스턴스는 클래스가 __eq__() 메서드를 정의하지 않는 한 일반적으로 같지 않은 것으로 비교됩니다.

클래스가 __lt__(), __le__(), __gt__() 및 __ge__() 메서드를 충분히 정의하지 않는 한 클래스의 인스턴스는 동일한 클래스의 다른 인스턴스 또는 다른 유형의 객체와 관련하여 순서를 지정할 수 없습니다(일반적으로 , __lt__() 및 __eq__()는 비교 연산자의 일반적인 의미를 원하는 경우 충분합니다.

is 및 is not 연산자의 동작은 사용자 정의할 수 없습니다. 또한 두 개체에 적용할 수 있으며 예외를 발생시키지 않습니다.

구문 우선 순위가 같은 in 및 in이 아닌 두 개의 추가 작업은 반복 가능하거나 __contains__() 메서드를 구현하는 유형에서 지원됩니다.

Numeric Types — intfloatcomplex

정수, 부동 소수점 숫자 및 복소수의 세 가지 숫자 유형이 있습니다. 또한 부울은 정수의 하위 유형입니다. 정수는 정밀도가 무제한입니다. 부동 소수점 숫자는 일반적으로 C에서 double을 사용하여 구현됩니다. 프로그램이 실행 중인 기계에 대한 부동 소수점 숫자의 정밀도 및 내부 표현에 대한 정보는 sys.float_info에서 사용할 수 있습니다. 복소수에는 각각 부동 소수점 숫자인 실수부와 허수부가 있습니다. 복소수 z에서 이러한 부분을 추출하려면 z.real 및 z.imag를 사용하십시오. (표준 라이브러리에는 추가 숫자 유형 fractions.Fraction(유리수용)과 decimal.Decimal(사용자 정의 정밀도가 있는 부동 소수점 숫자용)이 포함되어 있습니다.)

숫자는 숫자 리터럴에 의해 생성되거나 내장 함수 및 연산자의 결과로 생성됩니다. 장식되지 않은 정수 리터럴(16진수, 8진수 및 2진수 포함)은 정수를 산출합니다. 소수점 또는 지수 기호를 포함하는 숫자 리터럴은 부동 소수점 숫자를 생성합니다. 숫자 리터럴에 ‘j’ 또는 ‘J’를 추가하면 허수(실수 부분이 0인 복소수)가 생성되며 이를 정수 또는 float에 추가하여 실수 및 허수 부분이 있는 복소수를 얻을 수 있습니다.

Python은 혼합 산술을 완벽하게 지원합니다. 이진 산술 연산자에 다른 숫자 유형의 피연산자가 있는 경우 “좁은” 유형의 피연산자는 다른 피연산자로 확장됩니다. 여기서 정수는 부동 소수점보다 좁고 복소수보다 좁습니다. 서로 다른 유형의 숫자 간의 비교는 해당 숫자의 정확한 값이 비교되는 것처럼 동작합니다. 2

생성자 int(), float() 및 complex()를 사용하여 특정 유형의 숫자를 생성할 수 있습니다.

모든 숫자 유형(복소수 제외)은 다음 연산을 지원합니다(연산 우선 순위는 Operator precedence 참조).

OperationResultNotesFull documentation
x + ysum of x and y
x - ydifference of x and y
x * yproduct of x and y
x / yquotient of x and y
x // yfloored quotient of x and y(1)
x % yremainder of x / y(2)
-xx negated
+xx unchanged
abs(x)absolute value or magnitude of xabs()
int(x)x converted to integer(3)(6)int()
float(x)x converted to floating point(4)(6)float()
complex(re, im)a complex number with real part re, imaginary part imim defaults to zero.(6)complex()
c.conjugate()conjugate of the complex number c
divmod(x, y)the pair (x // y, x % y)(2)divmod()
pow(x, y)x to the power y(5)pow()
x ** yx to the power y(5)

노트:

  1. 정수 나눗셈이라고도 합니다. 결과 값은 전체 정수이지만 결과 유형이 반드시 int일 필요는 없습니다. 결과는 항상 마이너스 무한대로 반올림됩니다. 1//2는 0, (-1)//2는 -1, 1//(-2)는 -1, (-1)//(-2)는 0.
  2. 복소수가 아닙니다. 대신 적절한 경우 abs()를 사용하여 부동 소수점으로 변환합니다.
  3. 부동 소수점에서 정수로의 변환은 C에서와 같이 반올림하거나 잘릴 수 있습니다. 잘 정의된 변환에 대해서는 math.floor() 및 math.ceil() 함수를 참조하십시오.
  4. float는 또한 NaN(Not a Number) 및 양수 또는 음수 무한대에 대한 선택적 접두사 “+” 또는 “-“가 있는 문자열 “nan” 및 “inf”를 허용합니다.
  5. Python은 pow(0, 0) 및 0 ** 0을 프로그래밍 언어에서 일반적으로 1로 정의합니다.
  6. 허용되는 숫자 리터럴에는 0에서 9까지의 숫자 또는 이에 상응하는 유니코드(Nd 속성이 있는 코드 포인트)가 포함됩니다.

    Nd 속성이 있는 코드 포인트의 전체 목록은 https://www.unicode.org/Public/14.0.0/ucd/extracted/DerivedNumericType.txt를 참조하십시오.

모든 numbers.Real 유형(int 및 float)에는 다음 작업도 포함됩니다.

OperationResult
math.trunc(x)x truncated to Integral
round(x[, n])x rounded to n digits, rounding half to even. If n is omitted, it defaults to 0.
math.floor(x)the greatest Integral <= x
math.ceil(x)the least Integral >= x

추가 숫자 연산에 대해서는 mathcmath 모듈을 참조하십시오.

Bitwise Operations on Integer Types

비트 연산은 정수에 대해서만 의미가 있습니다. 비트 연산의 결과는 무한한 수의 부호 비트로 2의 보수로 수행되는 것처럼 계산됩니다.

이진 비트 연산의 우선 순위는 모두 숫자 연산보다 낮고 비교보다 높습니다. 단항 연산 ~은 다른 단항 숫자 연산(+ 및 -)과 동일한 우선 순위를 갖습니다.

이 표는 오름차순 우선 순위로 정렬된 비트 연산을 나열합니다.

OperationResultNotes
x | ybitwise or of x and y(4)
x ^ ybitwise exclusive or of x and y(4)
x & ybitwise and of x and y(4)
x << nx shifted left by n bits(1)(2)
x >> nx shifted right by n bits(1)(3)
~xthe bits of x inverted

노트:

  1. 음수 이동 횟수는 불법이며 ValueError가 발생합니다.
  2. n 비트만큼 왼쪽으로 이동하는 것은 pow(2, n)을 곱하는 것과 같습니다.
  3. n 비트만큼 오른쪽으로 이동하는 것은 pow(2, n)으로 바닥을 나누는 것과 같습니다.
  4. 유한 2의 보수 표현(1 + max(x.bit_length(), y.bit_length()) 이상의 작업 비트 폭)에서 적어도 하나의 추가 부호 확장 비트로 이러한 계산을 수행하면 동일한 결과를 얻기에 충분합니다. 마치 무한한 수의 부호 비트가 있는 것처럼.

Additional Methods on Integer Types

int 유형은 numbers.Integral abstract base class를 구현합니다. 또한 다음과 같은 몇 가지 방법을 더 제공합니다.

int.bit_length()

부호와 선행 0을 제외하고 정수를 이진수로 나타내는 데 필요한 비트 수를 반환합니다.

>>> n = -37
>>> bin(n)
'-0b100101'
>>> n.bit_length()
6

보다 정확하게는 x가 0이 아닌 경우 x.bit_length()는 2**(k-1) <= abs(x) < 2**k가 되는 고유한 양의 정수 k입니다. 마찬가지로, abs(x)가 올바르게 반올림된 로그를 가질 만큼 충분히 작은 경우 k = 1 + int(log(abs(x), 2))입니다. x가 0이면 x.bit_length()는 0을 반환합니다.

다음과 같음:

def bit_length(self):
    s = bin(self)       # binary representation:  bin(-37) --> '-0b100101'
    s = s.lstrip('-0b') # remove leading zeros and minus sign
    return len(s)       # len('100101') --> 6

버전 3.1의 새로운 기능.

int.bit_count()

정수 절대값의 이진 표현에서 1의 수를 반환합니다. 이것은 인구수라고도 합니다. 예:

>>> n = 19
>>> bin(n)
'0b10011'
>>> n.bit_count()
3
>>> (-n).bit_count()
3

위의 코드는 다음과 동일함:

def bit_count(self):
    return bin(self).count("1")

버전 3.10의 새로운 기능.

int.to_bytes(length=1byteorder=’big’*signed=False)

정수를 나타내는 바이트 배열을 반환합니다.

>>> (1024).to_bytes(2, byteorder='big')
b'\x04\x00'
>>> (1024).to_bytes(10, byteorder='big')
b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00'
>> (-1024).to_bytes(10, byteorder='big', signed=True)
b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00'
>> x = 1000
>> x.to_bytes((x.bit_length() + 7) // 8, byteorder='little')
b'\xe8\x03'

정수는 길이 바이트를 사용하여 표현되며 기본값은 1입니다. 주어진 바이트 수로 정수를 표현할 수 없으면 OverflowError가 발생합니다.

byteorder 인수는 정수를 나타내는 데 사용되는 바이트 순서를 결정하며 기본값은 “big”입니다. byteorder가 “big”이면 최상위 바이트는 바이트 배열의 시작 부분에 있습니다. byteorder가 “little”이면 최상위 바이트는 바이트 배열의 끝에 있습니다.

signed 인수는 2의 보수가 정수를 나타내는 데 사용되는지 여부를 결정합니다. signed가 False이고 음의 정수가 제공되면 OverflowError가 발생합니다. 서명된 기본값은 False입니다.

기본값은 정수를 단일 바이트 개체로 편리하게 변환하는 데 사용할 수 있습니다. 그러나 기본 인수를 사용할 때 255보다 큰 값을 변환하지 마십시오. 그렇지 않으면 OverflowError가 발생합니다.

>>> (65).to_bytes()
b'A'

위의 코드는 다음과 동일합니다.

def to_bytes(n, length=1, byteorder='big', signed=False):
    if byteorder == 'little':
        order = range(length)
    elif byteorder == 'big':
        order = reversed(range(length))
    else:
        raise ValueError("byteorder must be either 'little' or 'big'")

    return bytes((n >> i*8) & 0xff for i in order)

버전 3.2의 새로운 기능.

버전 3.11에서 변경: 길이 및 바이트 순서에 대한 기본 인수 값을 추가했습니다.

classmethod int.from_bytes(bytesbyteorder=’big’*signed=False)

주어진 바이트 배열이 나타내는 정수를 반환합니다.

>>> int.from_bytes(b'\x00\x10', byteorder='big')
16
>>> int.from_bytes(b'\x00\x10', byteorder='little')
4096
>>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True)
-1024
>>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False)
64512
>>> int.from_bytes([255, 0, 0], byteorder='big')
16711680

인수 bytes는 바이트열류 객체이거나 반복 가능한 생산 바이트여야 합니다.

byteorder 인수는 정수를 나타내는 데 사용되는 바이트 순서를 결정하며 기본값은 “big”입니다. byteorder가 “big”이면 최상위 바이트는 바이트 배열의 시작 부분에 있습니다. byteorder가 “little”이면 최상위 바이트는 바이트 배열의 끝에 있습니다. 호스트 시스템의 기본 바이트 순서를 요청하려면 sys.byteorder를 바이트 순서 값으로 사용하십시오.

signed 인수는 정수를 나타내는 데 2의 보수가 사용되는지 여부를 나타냅니다.

다음과 동일:

def from_bytes(bytes, byteorder='big', signed=False):
    if byteorder == 'little':
        little_ordered = list(bytes)
    elif byteorder == 'big':
        little_ordered = list(reversed(bytes))
    else:
        raise ValueError("byteorder must be either 'little' or 'big'")

    n = sum(b << i*8 for i, b in enumerate(little_ordered))
    if signed and little_ordered and (little_ordered[-1] & 0x80):
        n -= 1 << 8*len(little_ordered)

    return n

버전 3.2의 새로운 기능.

버전 3.11에서 변경: 바이트 순서에 대한 기본 인수 값을 추가했습니다.

int.as_integer_ratio()

비율이 원래 정수와 정확히 같고 양의 분모를 갖는 정수 쌍을 반환합니다. 정수(정수)의 정수비는 항상 분자가 정수이고 분모가 1입니다.

버전 3.8의 새로운 기능.

Additional Methods on Float

float 유형은 numbers.Real 추상 기본 클래스를 구현합니다. float에는 다음과 같은 추가 메서드도 있습니다.

float.as_integer_ratio()

비율이 원래 float와 정확히 같고 양의 분모를 가진 정수 쌍을 반환합니다. 무한대에서는 OverflowError를, NaN에서는 ValueError를 발생시킵니다.

float.is_integer()

float 인스턴스가 정수 값으로 유한한 경우 True를 반환하고 그렇지 않은 경우 False를 반환합니다.

>>> (-2.0).is_integer()
True
>>> (3.2).is_integer()
False

두 가지 방법이 16진수 문자열과의 변환을 지원합니다. 파이썬의 부동 소수점은 내부적으로 이진수로 저장되기 때문에 부동 소수점을 십진수 문자열로 변환하거나 반대로 변환하면 일반적으로 작은 반올림 오류가 발생합니다. 반대로 16진수 문자열을 사용하면 부동 소수점 숫자를 정확하게 표현하고 지정할 수 있습니다. 이는 디버깅 및 수치 작업 시 유용할 수 있습니다.

float.hex()

부동 소수점 숫자의 표현을 16진수 문자열로 반환합니다. 유한 부동 소수점 숫자의 경우 이 표현에는 항상 선행 0x와 후행 p 및 지수가 포함됩니다.

classmethod float.fromhex(s)

16진수 문자열 s로 표시되는 부동 소수점을 반환하는 클래스 메서드입니다. 문자열 s에는 선행 및 후행 공백이 있을 수 있습니다.

float.hex()는 인스턴스 메서드이고 float.fromhex()는 클래스 메서드입니다.

16진수 문자열은 다음 형식을 취합니다.

[sign] ['0x'] integer ['.' fraction] ['p' exponent]

여기서 선택적 부호는 + 또는 -일 수 있고, 정수 및 분수는 16진수 문자열이고 지수는 선택적 선행 부호가 있는 10진수 정수입니다. 대소문자는 중요하지 않으며 정수 또는 분수에 적어도 하나의 16진수가 있어야 합니다. 이 구문은 C99 표준의 섹션 6.4.4.2에 지정된 구문 및 Java 1.5 이후에 사용되는 구문과 유사합니다. 특히 float.hex()의 출력은 C 또는 Java 코드에서 16진수 부동 소수점 리터럴로 사용할 수 있으며 C의 %a 형식 문자 또는 Java의 Double.toHexString에 의해 생성된 16진수 문자열은 float.fromhex()에서 허용됩니다.

지수는 16진수가 아닌 10진수로 작성되며 계수를 곱하기 위해 2의 거듭제곱을 제공합니다. 예를 들어, 16진수 문자열 0x3.a7p10은 부동 소수점 숫자(3 + 10./16 + 7./16**2) * 2.0**10 또는 3740.0을 나타냅니다.

>>> float.fromhex('0x3.a7p10')
3740.0

역변환을 3740.0에 적용하면 동일한 숫자를 나타내는 다른 16진수 문자열이 제공됩니다.

>>> float.hex(3740.0)
'0x1.d380000000000p+11'

Hashing of numeric types

다른 유형의 숫자 x와 y의 경우 x == y일 때마다 hash(x) == hash(y)가 되어야 합니다(자세한 내용은 __hash__() 메서드 문서 참조). 다양한 숫자 유형(int, float, decimal.Decimal 및 fractions.Fraction 포함)에서 구현의 용이성과 효율성을 위해 숫자 유형에 대한 Python의 해시는 유리수에 대해 정의된 단일 수학 함수를 기반으로 하므로 모든 유형에 적용됩니다. int 및 fractions.Fraction의 인스턴스, float 및 decimal.Decimal의 모든 유한 인스턴스. 기본적으로 이 함수는 고정된 소수 P에 대한 축소 모듈로 P에 의해 제공됩니다. P의 값은 sys.hash_info의 모듈러스 속성으로 Python에서 사용할 수 있습니다.

CPython 구현 세부 정보: 현재 사용되는 소수는 32비트 C long이 있는 컴퓨터에서 P = 2**31 – 1이고 64비트 C long이 있는 컴퓨터에서 P = 2**61 – 1입니다.

자세한 규칙은 다음과 같습니다.

  • x = m / n이 음이 아닌 유리수이고 n을 P로 나눌 수 없는 경우 해시(x)를 m * invmod(n, P) % P로 정의합니다. 여기서 invmod(n, P)는 n 모듈로 P의 역수를 제공합니다. .
  • x = m / n이 음이 아닌 유리수이고 n이 P로 나누어질 수 있는 경우(그러나 m은 그렇지 않음) n은 역 모듈로 P를 가지지 않으며 위의 규칙이 적용되지 않습니다. 이 경우 hash(x)를 상수 값 sys.hash_info.inf로 정의합니다.
  • x = m / n이 음의 유리수이면 hash(x)를 -hash(-x)로 정의합니다. 결과 해시가 -1이면 -2로 바꿉니다.
  • 특정 값 sys.hash_info.inf 및 -sys.hash_info.inf는 각각 양의 무한대 또는 음의 무한대에 대한 해시 값으로 사용됩니다.
  • 복소수 z의 경우 실수부와 허수부의 해시 값은 hash(z.real) + sys.hash_info.imag * hash(z.imag), 축소 모듈로 2**sys.hash_info.width를 계산하여 결합됩니다. 범위(-2**(sys.hash_info.width – 1), 2**(sys.hash_info.width – 1))에 있습니다. 다시 말하지만 결과가 -1이면 -2로 대체됩니다.

위의 규칙을 명확히 하기 위해 다음은 유리수, 실수 또는 복소수의 해시를 계산하기 위한 내장 해시에 해당하는 Python 코드의 예입니다.

import sys, math

def hash_fraction(m, n):
    """Compute the hash of a rational number m / n.

    Assumes m and n are integers, with n positive.
    Equivalent to hash(fractions.Fraction(m, n)).

    """
    P = sys.hash_info.modulus
    # Remove common factors of P.  (Unnecessary if m and n already coprime.)
    while m % P == n % P == 0:
        m, n = m // P, n // P

    if n % P == 0:
        hash_value = sys.hash_info.inf
    else:
        # Fermat's Little Theorem: pow(n, P-1, P) is 1, so
        # pow(n, P-2, P) gives the inverse of n modulo P.
        hash_value = (abs(m) % P) * pow(n, P - 2, P) % P
    if m < 0:
        hash_value = -hash_value
    if hash_value == -1:
        hash_value = -2
    return hash_value

def hash_float(x):
    """Compute the hash of a float x."""

    if math.isnan(x):
        return object.__hash__(x)
    elif math.isinf(x):
        return sys.hash_info.inf if x > 0 else -sys.hash_info.inf
    else:
        return hash_fraction(*x.as_integer_ratio())

def hash_complex(z):
    """Compute the hash of a complex number z."""

    hash_value = hash_float(z.real) + sys.hash_info.imag * hash_float(z.imag)
    # do a signed reduction modulo 2**sys.hash_info.width
    M = 2**(sys.hash_info.width - 1)
    hash_value = (hash_value & (M - 1)) - (hash_value & M)
    if hash_value == -1:
        hash_value = -2
    return hash_value

Iterator Types

Python은 컨테이너에 대한 반복 개념을 지원합니다. 이는 두 가지 고유한 방법을 사용하여 구현됩니다. 이는 사용자 정의 클래스가 반복을 지원하도록 허용하는 데 사용됩니다. 아래에서 자세히 설명하는 시퀀스는 항상 반복 방법을 지원합니다.

반복 가능한 지원을 제공하려면 컨테이너 개체에 대해 한 가지 메서드를 정의해야 합니다.

container.__iter__()

반복자 객체를 반환합니다. 개체는 아래에 설명된 반복자 프로토콜을 지원하는 데 필요합니다. 컨테이너가 다른 유형의 반복을 지원하는 경우 해당 반복 유형에 대한 반복자를 구체적으로 요청하기 위해 추가 메서드를 제공할 수 있습니다. (여러 형식의 반복을 지원하는 개체의 예는 폭 우선 및 깊이 우선 순회를 모두 지원하는 트리 구조입니다.) 이 방법은 Python/C API에서 Python 개체에 대한 유형 구조의 tp_iter 슬롯에 해당합니다.

반복자 객체 자체는 함께 반복자 프로토콜을 형성하는 다음 두 가지 방법을 지원하는 데 필요합니다.

iterator.__iter__()

반복자 객체 자체를 반환합니다. for 및 in 문과 함께 컨테이너와 반복자를 모두 사용할 수 있도록 하려면 이 작업이 필요합니다. 이 메서드는 Python/C API에서 Python 개체에 대한 유형 구조의 tp_iter 슬롯에 해당합니다.

iterator.__next__()

반복자에서 다음 항목을 반환합니다. 더 이상 항목이 없으면 StopIteration 예외를 발생시킵니다. 이 메서드는 Python/C API에서 Python 객체에 대한 유형 구조의 tp_iternext 슬롯에 해당합니다.

Python은 일반 및 특정 시퀀스 유형, 사전 및 기타 보다 전문화된 형식에 대한 반복을 지원하기 위해 여러 반복자 개체를 정의합니다. 특정 유형은 반복자 프로토콜 구현 외에는 중요하지 않습니다.

이터레이터의 __next__() 메서드가 StopIteration을 일으키면 후속 호출에서 계속해서 그렇게 해야 합니다. 이 속성을 따르지 않는 구현은 손상된 것으로 간주됩니다.

Generator Types

Python의 생성기는 반복자 프로토콜을 구현하는 편리한 방법을 제공합니다. 컨테이너 객체의 __iter__() 메서드가 제너레이터로 구현되면 자동으로 __iter__() 및 __next__() 메서드를 제공하는 이터레이터 객체(기술적으로는 제너레이터 객체)를 반환합니다. 생성기에 대한 자세한 내용은 yield 표현식 문서에서 찾을 수 있습니다.

Sequence Types — listtuplerange

목록, 튜플 및 범위 개체의 세 가지 기본 시퀀스 유형이 있습니다. 이진 데이터 및 텍스트 문자열 처리에 맞게 조정된 추가 시퀀스 유형은 전용 섹션에 설명되어 있습니다.

Common Sequence Operations

다음 표의 작업은 변경 가능 및 변경 불가능한 대부분의 시퀀스 유형에서 지원됩니다. collections.abc.Sequence ABC는 사용자 지정 시퀀스 유형에서 이러한 작업을 보다 쉽게 올바르게 구현할 수 있도록 제공됩니다.

이 표는 오름차순 우선 순위로 정렬된 시퀀스 작업을 나열합니다. 테이블에서 s와 t는 동일한 유형의 시퀀스이고 n, i, j 및 k는 정수이고 x는 s에 의해 부과된 모든 유형 및 값 제한을 충족하는 임의의 개체입니다.

in 및 not in 작업은 비교 작업과 동일한 우선 순위를 갖습니다. +(연결) 및 *(반복) 연산은 해당 숫자 연산과 동일한 우선 순위를 갖습니다. 삼

OperationResultNotes
x in sTrue if an item of s is equal to x, else False(1)
x not in sFalse if an item of s is equal to x, else True(1)
s + tthe concatenation of s and t(6)(7)
s * n or n * sequivalent to adding s to itself n times(6)(7)
s[i]ith item of s, origin 0(3)
s[i:j]slice of s from i to j(3)(4)
s[i:j:k]slice of s from i to j with step k(3)(5)
len(s)length of s
min(s)smallest item of s
max(s)largest item of s
s.index(x[, i[, j]])index of the first occurrence of x in s (at or after index i and before index j)(3)(5)
s.count(x)total number of occurrences of x in s

동일한 유형의 시퀀스도 비교를 지원합니다. 특히 튜플과 목록은 해당 요소를 비교하여 사전순으로 비교됩니다. 이는 같음을 비교하려면 모든 요소가 같음을 비교해야 하고 두 시퀀스의 유형과 길이가 같아야 함을 의미합니다. (자세한 내용은 언어 참조의 비교를 참조하십시오.)

가변 시퀀스에 대한 정방향 및 역방향 반복기는 인덱스를 사용하여 값에 액세스합니다. 해당 인덱스는 기본 시퀀스가 변경되더라도 계속 앞으로(또는 뒤로) 행진합니다. Iterator는 IndexError 또는 StopIteration이 발생하는 경우(또는 인덱스가 0 아래로 떨어질 경우)에만 종료됩니다.

노트:

1. in 및 not in 작업은 일반적인 경우에 간단한 포함 테스트에만 사용되지만 일부 특수 시퀀스(예: str, bytes 및 bytearray)는 하위 시퀀스 테스트에도 사용합니다.

>> "gg" in "eggs"
True

2. 0보다 작은 n 값은 0으로 처리됩니다(s와 동일한 유형의 빈 시퀀스 생성). 시퀀스 s의 항목은 복사되지 않습니다. 그들은 여러 번 참조됩니다. 이것은 종종 새로운 Python 프로그래머를 괴롭힙니다. 고려하다:

>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]

일어난 일은 [[]]가 빈 목록을 포함하는 단일 요소 목록이므로 [[]] * 3의 세 요소 모두 이 단일 빈 목록에 대한 참조입니다. 목록의 요소를 수정하면 이 단일 목록이 수정됩니다. 다음과 같은 방법으로 다양한 목록의 목록을 만들 수 있습니다.

>>> lists = [[] for i in range(3)]
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
[[3], [5], [7]]

자세한 설명은 FAQ 항목에서 확인할 수 있습니다. 다차원 목록은 어떻게 만듭니까?.

3. i 또는 j가 음수이면 인덱스는 시퀀스 s의 끝을 기준으로 합니다. len(s) + i 또는 len(s) + j가 대체됩니다. 그러나 -0은 여전히 0입니다.

4. i에서 j까지 s의 슬라이스는 i <= k < j인 인덱스 k를 갖는 항목의 시퀀스로 정의됩니다. i 또는 j가 len(s)보다 크면 len(s)를 사용합니다. i가 생략되거나 None이면 0을 사용합니다. j가 생략되거나 None이면 len(s)를 사용합니다. i가 j보다 크거나 같으면 슬라이스가 비어 있습니다.

5. k 단계에서 i에서 j로의 s 조각은 0 <= n < (j-i)/k가 되는 인덱스 x = i + n*k를 갖는 항목의 시퀀스로 정의됩니다. 즉, 인덱스는 i, i+k, i+2*k, i+3*k 등이며 j에 도달하면 중지합니다(단, j는 포함하지 않음). k가 양수일 때 i와 j가 더 크면 len(s)로 줄어듭니다. k가 음수일 때 i와 j가 크면 len(s) – 1로 줄어듭니다. i 또는 j가 생략되거나 None이면 “종료” 값이 됩니다(종료는 k의 부호에 따라 다름). k는 0이 될 수 없습니다. k가 None이면 1처럼 취급됩니다.

6. 불변 시퀀스를 연결하면 항상 새 개체가 생성됩니다. 즉, 반복 연결을 통해 시퀀스를 구축하면 전체 시퀀스 길이에서 2차 런타임 비용이 발생합니다. 선형 런타임 비용을 얻으려면 아래 대안 중 하나로 전환해야 합니다.

  • str 객체를 연결하는 경우 목록을 만들고 마지막에 str.join()을 사용하거나 그렇지 않으면 io.StringIO 인스턴스에 쓰고 완료되면 해당 값을 검색할 수 있습니다.
  • 바이트열 객체를 연결하는 경우 유사하게 bytes.join() 또는 io.BytesIO를 사용하거나 bytearray 객체로 내부 연결을 수행할 수 있습니다. bytearray 객체는 변경 가능하며 효율적인 초과 할당 메커니즘이 있습니다.
  • 튜플 객체를 연결하는 경우 대신 목록을 확장하십시오.
  • 다른 유형의 경우 관련 클래스 문서를 조사하십시오.

7. 일부 시퀀스 유형(예: 범위)은 특정 패턴을 따르는 항목 시퀀스만 지원하므로 시퀀스 연결 또는 반복을 지원하지 않습니다.

8. x가 s에서 발견되지 않으면 index는 ValueError를 발생시킵니다. 모든 구현이 추가 인수 i 및 j 전달을 지원하는 것은 아닙니다. 이러한 인수를 사용하면 시퀀스의 하위 섹션을 효율적으로 검색할 수 있습니다. 추가 인수를 전달하는 것은 s[i:j].index(x)를 사용하는 것과 대략 동일하지만 데이터를 복사하지 않고 반환된 인덱스가 슬라이스의 시작이 아닌 시퀀스의 시작에 상대적입니다.

Immutable Sequence Types

변경 불가능한 시퀀스 유형이 일반적으로 구현하지만 변경 가능한 시퀀스 유형에 의해서도 구현되지 않는 유일한 작업은 hash() 내장에 대한 지원입니다.

이 지원을 통해 튜플 인스턴스와 같은 불변 시퀀스를 사전 키로 사용하고 set 및 frozenset 인스턴스에 저장할 수 있습니다.

해시할 수 없는 값을 포함하는 변경할 수 없는 시퀀스를 해시하려고 하면 TypeError가 발생합니다.

Mutable Sequence Types

다음 표의 연산은 변경 가능한 시퀀스 유형에 대해 정의됩니다. collections.abc.MutableSequence ABC는 사용자 지정 시퀀스 유형에서 이러한 작업을 보다 쉽게 올바르게 구현할 수 있도록 제공됩니다.

표에서 s는 변경 가능한 시퀀스 유형의 인스턴스이고, t는 반복 가능한 객체이고 x는 s에 의해 부과된 모든 유형 및 값 제한을 충족하는 임의의 객체입니다(예: bytearray는 값 제한 0 <=을 충족하는 정수만 허용합니다). x <= 255).

OperationResultNotes
s[i] = xs의 항목 i가 x로 대체됨
s[i:j] = ti에서 j까지의 s 슬라이스는 iterable t의 내용으로 대체됩니다.
del s[i:j]s[i:j] = []와 동일
s[i:j:k] = ts[i:j:k]의 요소는 t의 요소로 대체됩니다.(1)
del s[i:j:k]목록에서 s[i:j:k]의 요소를 제거합니다.
s.append(x)시퀀스의 끝에 x를 추가합니다(s[len(s):len(s)] = [x]와 동일).
s.clear()s에서 모든 항목을 제거합니다(del s[:]와 동일).(5)
s.copy()s의 얕은 복사본을 만듭니다(s[:]와 동일).(5)
s.extend(t) or s += tt의 내용으로 s를 확장합니다(대부분 s[len(s):len(s)] = t와 동일)
s *= n내용을 n번 반복하여 s를 업데이트합니다.(6)
s.insert(i, x)i에 의해 주어진 인덱스에서 x를 s에 삽입합니다(s[i:i] = [x]와 동일).
s.pop() or s.pop(i)i에서 항목을 검색하고 s에서도 제거합니다.(2)
s.remove(x)s[i]가 x와 같은 s에서 첫 번째 항목을 제거합니다.(3)
s.reverse()제자리에 있는 s의 항목을 뒤집습니다.(4)

노트:

  1. t는 교체하는 슬라이스와 길이가 같아야 합니다.
  2. 선택적 인수 i의 기본값은 -1이므로 기본적으로 마지막 항목이 제거되고 반환됩니다.
  3. remove()는 s에서 x를 찾을 수 없을 때 ValueError를 발생시킵니다.
  4. reverse() 메서드는 큰 시퀀스를 뒤집을 때 공간 절약을 위해 시퀀스를 수정합니다. 부작용으로 작동한다는 것을 사용자에게 상기시키기 위해 역순으로 반환하지 않습니다.
  5. clear() 및 copy()는 슬라이싱 작업(예: dict 및 set)을 지원하지 않는 가변 컨테이너의 인터페이스와의 일관성을 위해 포함됩니다. copy()는 collections.abc.MutableSequence ABC의 일부가 아니지만 대부분의 구체적인 가변 시퀀스 클래스에서 제공합니다.

    버전 3.3의 새로운 기능: clear() 및 copy() 메서드.
  6. 값 n은 정수이거나 __index__()를 구현하는 객체입니다. n의 0 및 음수 값은 시퀀스를 지웁니다. 시퀀스의 항목은 복사되지 않습니다. Common Sequence Operations에서 s * n에 대해 설명한 것처럼 여러 번 참조됩니다.

Lists

목록은 일반적으로 동종 항목의 컬렉션을 저장하는 데 사용되는 변경 가능한 시퀀스입니다(정확한 유사성 정도는 응용 프로그램에 따라 다름).

class list([iterable])

목록은 여러 가지 방법으로 구성할 수 있습니다.

  • 한 쌍의 대괄호를 사용하여 빈 목록을 나타냅니다. []
  • 대괄호 사용, 쉼표로 항목 구분: [a], [a, b, c]
  • 목록 내포 사용: [x for x in iterable]
  • 유형 생성자 사용: list() 또는 list(iterable)

생성자는 항목이 iterable의 항목과 동일하고 동일한 순서로 있는 목록을 작성합니다. iterable은 시퀀스, 반복을 지원하는 컨테이너 또는 반복자 객체일 수 있습니다. iterable이 이미 목록이면 iterable[:]과 유사하게 복사본을 만들어 반환합니다. 예를 들어 list(‘abc’)는 [‘a’, ‘b’, ‘c’]를 반환하고 list( (1, 2, 3) )는 [1, 2, 3]을 반환합니다. 인수가 제공되지 않으면 생성자는 새로운 빈 목록 []을 만듭니다.

sorted() 내장을 포함하여 다른 많은 작업도 목록을 생성합니다.

목록은 공통적이고 변경 가능한 모든 시퀀스 작업을 구현합니다. 목록은 다음과 같은 추가 방법도 제공합니다.

sort(*key=Nonereverse=False)

이 메서드는 항목 간의 < 비교만 사용하여 목록을 제자리에 정렬합니다. 예외는 억제되지 않습니다. 비교 작업이 실패하면 전체 정렬 작업이 실패하고 목록이 부분적으로 수정된 상태로 남을 수 있습니다.

sort()는 키워드로만 전달될 수 있는 두 개의 인수(키워드 전용 인수)를 허용합니다.

key는 각 목록 요소에서 비교 키를 추출하는 데 사용되는 하나의 인수 함수를 지정합니다(예: key=str.lower). 목록의 각 항목에 해당하는 키는 한 번 계산된 다음 전체 정렬 프로세스에 사용됩니다. 기본값 없음은 목록 항목이 별도의 키 값을 계산하지 않고 직접 정렬됨을 의미합니다.

functools.cmp_to_key() 유틸리티를 사용하여 2.x 스타일 cmp 함수를 키 함수로 변환할 수 있습니다.

반전은 부울 값입니다. True로 설정하면 각 비교가 반대인 것처럼 목록 요소가 정렬됩니다.

이 방법은 큰 시퀀스를 정렬할 때 공간 절약을 위해 시퀀스를 수정합니다. 부작용으로 작동한다는 것을 사용자에게 상기시키기 위해 정렬된 시퀀스를 반환하지 않습니다(새로 정렬된 목록 인스턴스를 명시적으로 요청하려면 sorted() 사용).

sort() 메서드는 안정성이 보장됩니다. 동등하다고 비교되는 요소의 상대적인 순서를 변경하지 않는 경우 정렬이 안정적입니다. 이는 여러 단계에서 정렬하는 데 유용합니다(예: 부서별로 정렬한 다음 급여 등급별로 정렬).

정렬 예제와 간단한 정렬 튜토리얼은 Sorting HOW TO를 참조하십시오.

CPython 구현 세부 사항: 목록이 정렬되는 동안 목록을 변경하거나 검사하려는 시도의 효과는 정의되지 않습니다. Python의 C 구현은 목록이 기간 동안 비어 있는 것처럼 보이게 하고, 정렬 중에 목록이 변경된 것을 감지할 수 있으면 ValueError 를 발생시킵니다.

Tuples

튜플은 일반적으로 이기종 데이터 모음을 저장하는 데 사용되는 불변 시퀀스입니다(예: enumerate() 내장에 의해 생성된 2-튜플). 튜플은 동종 데이터의 불변 시퀀스가 필요한 경우에도 사용됩니다(예: set 또는 dict 인스턴스에 저장 허용).

class tuple([iterable])

튜플은 여러 가지 방법으로 구성할 수 있습니다.

  • 한 쌍의 괄호를 사용하여 빈 튜플을 나타냅니다: ()
  • 싱글톤 튜플에 후행 쉼표 사용: a, 또는 (a,)
  • 쉼표로 항목 구분: a, b, c 또는 (a, b, c)
  • 내장 tuple() 사용: tuple() 또는 tuple(iterable)

생성자는 항목이 iterable의 항목과 동일하고 동일한 순서로 있는 튜플을 빌드합니다. iterable은 시퀀스, 반복을 지원하는 컨테이너 또는 반복자 객체일 수 있습니다. iterable이 이미 튜플이면 변경되지 않고 반환됩니다. 예를 들어, tuple(‘abc’)는 (‘a’, ‘b’, ‘c’)를 반환하고 tuple( [1, 2, 3] )은 (1, 2, 3)을 반환합니다. 인수가 제공되지 않으면 생성자는 새로운 빈 튜플()을 만듭니다.

실제로 튜플을 만드는 것은 괄호가 아니라 쉼표입니다. 괄호는 빈 튜플의 경우나 구문 모호성을 피하기 위해 필요한 경우를 제외하고 선택 사항입니다. 예를 들어, f(a, b, c)는 세 개의 인수가 있는 함수 호출이고 f((a, b, c))는 3-튜플이 유일한 인수인 함수 호출입니다.

튜플은 모든 공통 시퀀스 작업을 구현합니다.

인덱스에 의한 액세스보다 이름에 의한 액세스가 더 명확한 이기종 데이터 컬렉션의 경우 collections.namedtuple()이 단순한 튜플 객체보다 더 적절한 선택일 수 있습니다.

Ranges

범위 유형은 불변의 숫자 시퀀스를 나타내며 일반적으로 for 루프에서 특정 횟수만큼 루핑하는 데 사용됩니다.

class range(stop)
class range(start, stop[, step])

범위 생성자에 대한 인수는 정수(내장 int 또는 __index__() 특수 메서드를 구현하는 객체)여야 합니다. 단계 인수가 생략되면 기본값은 1입니다. 시작 인수가 생략되면 기본값은 0입니다. 단계가 0이면 ValueError가 발생합니다.

양수 단계의 경우 범위 r의 내용은 공식 r[i] = start + step*i에 의해 결정됩니다. 여기서 i >= 0 및 r[i] < stop입니다.

음수 단계의 경우 범위의 내용은 여전히 공식 r[i] = start + step*i로 결정되지만 제약 조건은 i >= 0 및 r[i] > stop입니다.

범위 개체는 r[0]이 값 제약 조건을 충족하지 않는 경우 비어 있습니다. 범위는 음수 인덱스를 지원하지만 이는 양수 인덱스에 의해 결정된 시퀀스의 끝에서 인덱싱하는 것으로 해석됩니다.

sys.maxsize보다 큰 절대값을 포함하는 범위는 허용되지만 일부 기능(예: len())은 OverflowError를 발생시킬 수 있습니다.

범위 예시:

>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(range(0, 30, 5))
[0, 5, 10, 15, 20, 25]
>>> list(range(0, 10, 3))
[0, 3, 6, 9]
>>> list(range(0, -10, -1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> list(range(0))
[]
>>> list(range(1, 0))
[]

범위는 연결 및 반복을 제외한 모든 일반적인 시퀀스 작업을 구현합니다(범위 객체는 엄격한 패턴을 따르는 시퀀스만 나타낼 수 있고 반복 및 연결은 일반적으로 해당 패턴을 위반하기 때문입니다).

start
시작 매개변수의 값(또는 매개변수가 제공되지 않은 경우 0)

stop
중지 매개변수의 값

step
단계 매개변수의 값(또는 매개변수가 제공되지 않은 경우 1)

일반 목록이나 튜플에 비해 범위 유형의 장점은 범위 객체가 나타내는 범위의 크기에 관계없이 항상 동일한(작은) 양의 메모리를 사용한다는 것입니다(시작, 중지 및 단계 값만 저장하기 때문). , 필요에 따라 개별 항목 및 하위 범위 계산).

Range 개체는 collections.abc.Sequence ABC를 구현하고 포함 테스트, 요소 인덱스 조회, 슬라이싱 및 음수 인덱스 지원과 같은 기능을 제공합니다(시퀀스 유형 — 목록, 튜플, 범위 참조).

>>> r = range(0, 20, 2)
>>> r
range(0, 20, 2)
>>> 11 in r
False
>>> 10 in r
True
>>> r.index(10)
5
>>> r[5]
10
>>> r[:5]
range(0, 10, 2)
>>> r[-1]
18

== 및 != 와 동일한지 범위 객체를 테스트하여 시퀀스로 비교합니다. 즉, 두 개의 범위 개체가 동일한 값 시퀀스를 나타내는 경우 동일한 것으로 간주됩니다. (동일하다고 비교되는 두 범위 객체는 서로 다른 시작, 중지 및 단계 속성을 가질 수 있습니다. 예를 들어 range(0) == range(2, 1, 3) 또는 range(0, 3, 2) == range(0, 4, 2).)

버전 3.2에서 변경: 시퀀스 ABC를 구현합니다. 슬라이싱 및 음수 인덱스를 지원합니다. 모든 항목을 반복하는 대신 일정한 시간에 int 개체의 멤버십을 테스트합니다.

버전 3.3에서 변경: ‘==’ 및 ‘!=’를 정의하여 개체 ID를 기반으로 비교하는 대신 정의하는 값의 시퀀스를 기반으로 범위 개체를 비교합니다.

버전 3.3의 새로운 기능: 시작, 중지 및 단계 속성.

See also:
linspace recipe는 부동 소수점 응용 프로그램에 적합한 범위의 게으른 버전을 구현하는 방법을 보여줍니다.

Text Sequence Type — str

Python의 텍스트 데이터는 str 개체 또는 문자열로 처리됩니다. 문자열은 유니코드 코드 포인트의 불변 시퀀스입니다. 문자열 리터럴은 다양한 방법으로 작성됩니다.

  • 작은따옴표: ‘”큰따옴표” 포함 허용’
  • 큰따옴표: “삽입된 ‘작은따옴표’ 허용”
  • 삼중 인용부호: ”’작은따옴표 세 개”’, “””큰따옴표 세 개”””

삼중 인용 문자열은 여러 줄에 걸쳐 있을 수 있습니다. 관련된 모든 공백은 문자열 리터럴에 포함됩니다.

단일 식의 일부이고 사이에 공백만 있는 문자열 리터럴은 암시적으로 단일 문자열 리터럴로 변환됩니다. 즉, (“스팸” “계란”) == “스팸계란”입니다.

지원되는 이스케이프 시퀀스 및 대부분의 이스케이프 시퀀스 처리를 비활성화하는 r(“원시”) 접두사를 포함하여 다양한 형태의 문자열 리터럴에 대한 자세한 내용은 문자열 및 바이트 리터럴을 참조하세요.

str 생성자를 사용하여 다른 개체에서 문자열을 만들 수도 있습니다.

별도의 “문자” 유형이 없기 때문에 문자열을 인덱싱하면 길이가 1인 문자열이 생성됩니다. 즉, 비어 있지 않은 문자열 s의 경우 s[0] == s[0:1]입니다.

변경 가능한 문자열 유형도 없지만 str.join() 또는 io.StringIO를 사용하여 여러 조각에서 문자열을 효율적으로 구성할 수 있습니다.

버전 3.3에서 변경: Python 2 시리즈와의 하위 호환성을 위해 문자열 리터럴에서 u 접두사가 다시 한 번 허용됩니다. 문자열 리터럴의 의미에는 영향을 미치지 않으며 r 접두사와 결합할 수 없습니다.

class str(object=”)
class str(object=b”, encoding=’utf-8′, errors=’strict’)

객체의 문자열 버전을 반환합니다. 객체가 제공되지 않으면 빈 문자열을 반환합니다. 그렇지 않으면 str()의 동작은 다음과 같이 인코딩 또는 오류가 제공되는지 여부에 따라 달라집니다.

인코딩도 오류도 지정되지 않은 경우 str(객체)는 type(객체).__str__(객체)를 반환하며, 이는 object의 “비공식” 또는 멋지게 인쇄 가능한 문자열 표현입니다. 문자열 개체의 경우 문자열 자체입니다. 객체에 __str__() 메서드가 없으면 str()은 repr(객체)를 반환합니다.

인코딩 또는 오류 중 적어도 하나가 제공되면 객체는 바이트열류 객체(예: bytes 또는 bytearray)여야 합니다. 이 경우 객체가 바이트열(또는 바이트 배열) 객체이면 str(bytes, encoding, errors)는 bytes.decode(encoding, errors)와 동일합니다. 그렇지 않으면 버퍼 객체의 기본이 되는 bytes 객체는 bytes.decode()를 호출하기 전에 가져옵니다. 버퍼 개체에 대한 정보는 바이너리 시퀀스 유형 — 바이트, 바이트 배열, 메모리 뷰 및 버퍼 프로토콜을 참조하십시오.

encoding 또는 errors 인수 없이 바이트 객체를 str()에 전달하는 것은 비공식 문자열 표현을 반환하는 첫 번째 경우에 해당합니다(Python에 대한 -b 명령줄 옵션 참조). 예를 들어:

>>> str(b'Zoot!')
"b'Zoot!'"

str 클래스 및 해당 메서드에 대한 자세한 내용은 아래의 텍스트 시퀀스 유형 — str 및 문자열 메서드 섹션을 참조하십시오. 형식이 지정된 문자열을 출력하려면 형식이 지정된 문자열 리터럴 및 형식 문자열 구문 섹션을 참조하세요. 또한 텍스트 처리 서비스 섹션을 참조하십시오.

String Methods

문자열은 아래에 설명된 추가 메서드와 함께 모든 공통 시퀀스 작업을 구현합니다.

문자열은 또한 두 가지 스타일의 문자열 포매팅을 지원합니다. 하나는 상당한 수준의 유연성과 사용자 지정을 제공하고(str.format(), 포맷 문자열 구문 및 사용자 정의 문자열 포맷팅 참조) 다른 하나는 더 좁은 범위의 유형을 처리하는 C printf 스타일 포맷팅을 기반으로 합니다. 올바르게 사용하기는 약간 어렵지만 처리할 수 있는 경우에는 더 빠릅니다(printf 스타일 문자열 형식화).

표준 라이브러리의 텍스트 처리 서비스 섹션은 다양한 텍스트 관련 유틸리티(re 모듈의 정규식 지원 포함)를 제공하는 다른 여러 모듈을 다룹니다.

str.capitalize()

첫 번째 문자가 대문자이고 나머지는 소문자로 된 문자열의 복사본을 반환합니다.

버전 3.8에서 변경: 첫 번째 문자는 이제 대문자가 아닌 제목으로 입력됩니다. 즉, digraph와 같은 문자는 전체 문자가 아닌 첫 글자만 대문자로 표시됩니다.

str.casefold()

문자열의 케이스폴딩된 복사본을 반환합니다. 대소문자 구분 문자열은 대소문자 없는 일치에 사용할 수 있습니다.

Casefolding은 소문자와 유사하지만 문자열에서 모든 대소문자 구분을 제거하기 위한 것이기 때문에 더 공격적입니다. 예를 들어 독일어 소문자 ‘ß’는 “ss”와 같습니다. 이미 소문자이므로 lower()는 ‘ß’에 대해 아무 작업도 수행하지 않습니다. casefold()는 그것을 “ss”로 변환합니다.

케이스 폴딩 알고리즘은 유니코드 표준의 섹션 3.13에 설명되어 있습니다.

버전 3.3의 새로운 기능.

str.center(width[, fillchar])

길이 너비의 문자열 중앙에 반환합니다. 패딩은 지정된 fillchar(기본값은 ASCII 공간)를 사용하여 수행됩니다. 너비가 len(s)보다 작거나 같으면 원래 문자열이 반환됩니다.

str.count(sub[, start[, end]])

범위에서 하위 문자열 sub의 겹치지 않는 발생 횟수를 반환합니다. 선택적 인수 start 및 end는 슬라이스 표기법으로 해석됩니다.

sub가 비어 있으면 문자열 길이에 1을 더한 문자 사이의 빈 문자열 수를 반환합니다.

str.encode(encoding=’utf-8′, errors=’strict’)

바이트열로 인코딩된 문자열을 반환합니다.

인코딩 기본값은 ‘utf-8’입니다. 가능한 값은 표준 인코딩을 참조하십시오.

오류는 인코딩 오류를 처리하는 방법을 제어합니다. ‘strict'(기본값)이면 UnicodeError 예외가 발생합니다. 다른 가능한 값은 ‘ignore’, ‘replace’, ‘xmlcharrefreplace’, ‘backslashreplace’ 및 codecs.register_error()를 통해 등록된 다른 이름입니다. 자세한 내용은 오류 처리기를 참조하십시오.

성능상의 이유로 인코딩 오류가 실제로 발생하거나 Python 개발 모드가 활성화되거나 디버그 빌드가 사용되지 않는 한 오류 값의 유효성을 확인하지 않습니다.

버전 3.1에서 변경: 키워드 인수에 대한 지원이 추가되었습니다.

버전 3.9에서 변경: 이제 errors 인수의 값이 Python 개발 모드와 디버그 모드에서 확인됩니다.

str.endswith(suffix[, start[, end]])

문자열이 지정된 접미사로 끝나면 True를 반환하고 그렇지 않으면 False를 반환합니다. suffix는 찾을 접미사의 튜플일 수도 있습니다. 선택적 시작으로 해당 위치에서 테스트 시작. 옵션 끝으로 해당 위치에서 비교를 중지합니다.

str.expandtabs(tabsize=8)

현재 열과 지정된 탭 크기에 따라 모든 탭 문자가 하나 이상의 공백으로 대체된 문자열의 복사본을 반환합니다. 탭 위치는 탭 크기 문자마다 발생합니다(기본값은 8이며 열 0, 8, 16 등에서 탭 위치를 제공합니다). 문자열을 확장하려면 현재 열을 0으로 설정하고 문자열을 문자별로 검사합니다. 문자가 탭(\t)이면 현재 열이 다음 탭 위치와 같아질 때까지 하나 이상의 공백 문자가 결과에 삽입됩니다. (탭 문자 자체는 복사되지 않습니다.) 문자가 개행(\n) 또는 리턴(\r)이면 복사되고 현재 열이 0으로 재설정됩니다. 다른 모든 문자는 변경되지 않고 복사되며 현재 열은 인쇄 시 문자가 어떻게 표시되는지에 관계없이 1씩 증가합니다.

>>> '01\t012\t0123\t01234'.expandtabs()
'01      012     0123    01234'
>>> '01\t012\t0123\t01234'.expandtabs(4)
'01  012 0123    01234'

str.find(sub[, start[, end]])

슬라이스 s[start:end] 내에서 부분 문자열 sub가 발견되는 문자열에서 가장 낮은 인덱스를 반환합니다. 선택적 인수 start 및 end는 슬라이스 표기법으로 해석됩니다. sub를 찾을 수 없으면 -1을 반환합니다.

참고: sub의 위치를 알아야 하는 경우에만 find() 메서드를 사용해야 합니다. sub가 하위 문자열인지 확인하려면 in 연산자를 사용하십시오.

>>> 'Py' in 'Python'
True

str.format(*args**kwargs)

문자열 형식 지정 작업을 수행합니다. 이 메서드가 호출되는 문자열에는 리터럴 텍스트 또는 중괄호 {}로 구분된 대체 필드가 포함될 수 있습니다. 각 대체 필드에는 위치 인수의 숫자 인덱스 또는 키워드 인수의 이름이 포함됩니다. 각 대체 필드가 해당 인수의 문자열 값으로 대체되는 문자열의 복사본을 반환합니다.

>>> "The sum of 1 + 2 is {0}".format(1+2)
'The sum of 1 + 2 is 3'

형식 문자열에 지정할 수 있는 다양한 형식화 옵션에 대한 설명은 형식 문자열 구문을 참조하십시오.

참고 n 유형(예: ‘{:n}’.format(1234))으로 숫자(int, float, complex, decimal.Decimal 및 하위 클래스)를 포맷할 때 함수는 일시적으로 LC_CTYPE 로케일을 LC_NUMERIC 로케일로 설정합니다. ASCII가 아니거나 1바이트보다 길고 LC_NUMERIC 로케일이 LC_CTYPE 로케일과 다른 경우 localeconv()의 decimal_point 및 thousand_sep 필드를 디코딩합니다. 이 임시 변경은 다른 스레드에 영향을 미칩니다.

버전 3.7에서 변경: n 유형으로 숫자를 포맷할 때 함수는 경우에 따라 임시로 LC_CTYPE 로케일을 LC_NUMERIC 로케일로 설정합니다.

str.format_map(mapping)

str.format(**mapping)과 비슷하지만 매핑이 직접 사용되고 사전에 복사되지 않는다는 점만 다릅니다. 예를 들어 매핑이 dict 하위 클래스인 경우에 유용합니다.

>>> class Default(dict):
...     def __missing__(self, key):
...         return key
...
>>> '{name} was born in {country}'.format_map(Default(name='Guido'))
'Guido was born in country'

버전 3.2의 새로운 기능.

str.index(sub[, start[, end]])

find()와 비슷하지만 하위 문자열을 찾을 수 없으면 ValueError가 발생합니다.

str.isalnum()

문자열의 모든 문자가 영숫자(alphanumeric)이고 하나 이상의 문자가 있으면 True를 반환하고 그렇지 않으면 False를 반환합니다. c.isalpha(), c.isdecimal(), c.isdigit() 또는 c.isnumeric() 중 하나가 True를 반환하면 문자 c는 영숫자입니다.

str.isalpha()

문자열의 모든 문자가 알파벳이고 하나 이상의 문자가 있으면 True를 반환하고 그렇지 않으면 False를 반환합니다. 알파벳 문자는 유니코드 문자 데이터베이스에서 “Letter”로 정의된 문자, 즉 일반 범주 속성이 “Lm”, “Lt”, “Lu”, “Ll” 또는 “Lo” 중 하나인 문자입니다. 이는 유니코드 표준에서 정의된 “알파벳” 속성과 다릅니다.

str.isascii()

문자열이 비어 있거나 문자열의 모든 문자가 ASCII이면 True를 반환하고 그렇지 않으면 False를 반환합니다. ASCII 문자는 U+0000-U+007F 범위의 코드 포인트를 가집니다.

버전 3.7의 새로운 기능.

str.isdecimal()

문자열의 모든 문자가 십진수이고 적어도 하나의 문자가 있으면 True를 반환하고, 그렇지 않으면 False를 반환합니다. 10진수 문자는 10진법으로 숫자를 형성하는 데 사용할 수 있는 문자입니다. U+0660, 아랍어-인도 숫자 0. 공식적으로 10진수 문자는 유니코드 일반 범주 “Nd”의 문자입니다.

str.isdigit()

문자열의 모든 문자가 숫자이고 하나 이상의 문자가 있으면 True를 반환하고 그렇지 않으면 False를 반환합니다. 숫자에는 호환성 위 첨자 숫자와 같이 특별한 처리가 필요한 십진수 문자와 숫자가 포함됩니다. 여기에는 Kharosthi 숫자와 같이 10진법으로 숫자를 형성하는 데 사용할 수 없는 숫자가 포함됩니다. 공식적으로 숫자는 속성 값이 Numeric_Type=Digit 또는 Numeric_Type=Decimal인 문자입니다.

str.isidentifier()

언어 정의, 식별자 및 키워드 섹션에 따라 문자열이 유효한 식별자이면 True를 반환합니다.

string s가 def 및 class와 같은 예약된 식별자인지 테스트하려면 keyword.iskeyword()를 호출하십시오.

예:

>>> from keyword import iskeyword

>>> 'hello'.isidentifier(), iskeyword('hello')
(True, False)
>>> 'def'.isidentifier(), iskeyword('def')
(True, True)

str.islower()

문자열의 모든 케이스 문자 4가 소문자이고 케이스 문자가 하나 이상 있으면 True를 반환하고, 그렇지 않으면 False를 반환합니다.

str.isnumeric()

문자열의 모든 문자가 숫자이고 하나 이상의 문자가 있으면 True를 반환하고 그렇지 않으면 False를 반환합니다. 숫자 문자에는 숫자 문자와 유니코드 숫자 값 속성이 있는 모든 문자가 포함됩니다. U+2155, 저속한 분수 1/5. 공식적으로 숫자 문자는 속성 값이 Numeric_Type=Digit, Numeric_Type=Decimal 또는 Numeric_Type=Numeric인 문자입니다.

str.isprintable()

문자열의 모든 문자가 인쇄 가능하거나 문자열이 비어 있으면 True를 반환하고 그렇지 않으면 False를 반환합니다. 인쇄할 수 없는 문자는 인쇄 가능한 것으로 간주되는 ASCII 공간(0x20)을 제외하고 유니코드 문자 데이터베이스에서 “기타” 또는 “구분 기호”로 정의된 문자입니다. (이 문맥에서 인쇄 가능한 문자는 문자열에서 repr()이 호출될 때 이스케이프되어서는 안 되는 문자입니다. sys.stdout 또는 sys.stderr에 기록된 문자열 처리와 관련이 없습니다.)

str.isspace()

문자열에 공백 문자만 있고 하나 이상의 문자가 있으면 True를 반환하고 그렇지 않으면 False를 반환합니다.

유니코드 문자 데이터베이스(unicodedata 참조)에서 일반 범주가 Zs(“구분 기호, 공백”)이거나 양방향 클래스가 WS, B 또는 S 중 하나인 경우 문자는 공백입니다.

str.istitle()

문자열이 제목이 있는 문자열이고 적어도 하나의 문자가 있으면 True를 반환합니다. 예를 들어 대문자는 대소문자가 없는 문자 뒤에만 올 수 있고 소문자는 대소문자만 뒤따를 수 있습니다. 그렇지 않으면 False를 반환합니다.

str.isupper()

문자열의 모든 케이스 문자 4가 대문자이고 적어도 하나의 케이스 문자가 있으면 True를 반환하고, 그렇지 않으면 False를 반환합니다.

>>> 'BANANA'.isupper()
True
>>> 'banana'.isupper()
False
>>> 'baNana'.isupper()
False
>>> ' '.isupper()
False

str.join(iterable)

iterable에서 문자열을 연결한 문자열을 반환합니다. 바이트 객체를 포함하여 iterable에 문자열이 아닌 값이 있으면 TypeError가 발생합니다. 요소 사이의 구분 기호는 이 메서드를 제공하는 문자열입니다.

str.ljust(width[, fillchar])

길이가 너비인 문자열에서 왼쪽 정렬된 문자열을 반환합니다. 패딩은 지정된 fillchar(기본값은 ASCII 공간)를 사용하여 수행됩니다. 너비가 len(s)보다 작거나 같으면 원래 문자열이 반환됩니다.

str.lower()

모든 케이스 문자 4가 소문자로 변환된 문자열의 복사본을 반환합니다.

사용된 소문자 알고리즘은 유니코드 표준의 섹션 3.13에 설명되어 있습니다.

str.lstrip([chars])

선행 문자가 제거된 문자열의 복사본을 반환합니다. chars 인수는 제거할 문자 집합을 지정하는 문자열입니다. 생략하거나 None인 경우 chars 인수는 기본적으로 공백을 제거합니다. chars 인수는 접두사가 아닙니다. 오히려 해당 값의 모든 조합이 제거됩니다.

>>> '   spacious   '.lstrip()
'spacious   '
>>> 'www.example.com'.lstrip('cmowz.')
'example.com'

모든 문자 집합이 아닌 단일 접두사 문자열을 제거하는 메서드는 str.removeprefix()를 참조하십시오. 예를 들어:

>>> 'Arthur: three!'.lstrip('Arthur: ')
'ee!'
>>> 'Arthur: three!'.removeprefix('Arthur: ')
'three!'

static str.maketrans(x[, y[, z]])

이 정적 메서드는 str.translate()에 사용할 수 있는 변환 테이블을 반환합니다.

인수가 하나만 있는 경우 유니코드 서수(정수) 또는 문자(길이 1의 문자열)를 유니코드 서수, 문자열(임의의 길이) 또는 없음으로 매핑하는 사전이어야 합니다. 그러면 문자 키가 서수로 변환됩니다.

두 개의 인수가 있는 경우 길이가 같은 문자열이어야 하며 결과 사전에서 x의 각 문자는 y의 동일한 위치에 있는 문자에 매핑됩니다. 세 번째 인수가 있는 경우 문자열이어야 하며 해당 문자는 결과에서 None으로 매핑됩니다.

str.partition(sep)

sep의 첫 번째 항목에서 문자열을 분할하고 구분 기호 앞 부분, 구분 기호 자체 및 구분 기호 뒤 부분을 포함하는 3-튜플을 반환합니다. 구분자가 없으면 문자열 자체를 포함하는 3-튜플을 반환하고 두 개의 빈 문자열을 반환합니다.

str.removeprefix(prefix/)

문자열이 접두사 문자열로 시작하면 string[len(prefix):]를 반환합니다. 그렇지 않으면 원래 문자열의 복사본을 반환합니다.

>>> 'TestHook'.removeprefix('Test')
'Hook'
>>> 'BaseTestCase'.removeprefix('Test')
'BaseTestCase'

버전 3.9의 새로운 기능.

str.removesuffix(suffix/)

문자열이 접미사 문자열로 끝나고 해당 접미사가 비어 있지 않으면 string[:-len(suffix)]를 반환합니다. 그렇지 않으면 원래 문자열의 복사본을 반환합니다.

>>> 'MiscTests'.removesuffix('Tests')
'Misc'
>>> 'TmpDirMixin'.removesuffix('Tests')
'TmpDirMixin'

버전 3.9의 새로운 기능.

str.replace(oldnew[, count])

하위 문자열 old가 모두 new로 대체된 문자열의 복사본을 반환합니다. 선택적 인수 count가 제공되면 첫 번째 count 항목만 대체됩니다.

str.rfind(sub[, start[, end]])

sub가 s[start:end] 내에 포함되도록 하위 문자열 sub가 있는 문자열에서 가장 높은 인덱스를 반환합니다. 선택적 인수 start 및 end는 슬라이스 표기법으로 해석됩니다. 실패하면 -1을 반환합니다.

str.rindex(sub[, start[, end]])

rfind()와 비슷하지만 substring sub를 찾을 수 없을 때 ValueError를 발생시킵니다.

str.rjust(width[, fillchar])

길이 너비의 문자열에서 오른쪽 정렬된 문자열을 반환합니다. 패딩은 지정된 fillchar(기본값은 ASCII 공간)를 사용하여 수행됩니다. 너비가 len(s)보다 작거나 같으면 원래 문자열이 반환됩니다.

str.rpartition(sep)

sep의 마지막 항목에서 문자열을 분할하고 구분 기호 앞 부분, 구분 기호 자체 및 구분 기호 뒤 부분을 포함하는 3-튜플을 반환합니다. 구분 기호를 찾을 수 없으면 두 개의 빈 문자열과 문자열 자체를 포함하는 3-튜플을 반환합니다.

str.rsplit(sep=Nonemaxsplit=- 1)

구분 기호 문자열로 sep를 사용하여 문자열의 단어 목록을 반환합니다. maxsplit이 주어지면 최대 maxsplit 분할이 수행됩니다. sep가 지정되지 않았거나 None이면 모든 공백 문자열이 구분 기호입니다. 오른쪽에서 분할하는 것을 제외하고 rsplit()은 아래에서 자세히 설명하는 split()과 같이 동작합니다.

str.rstrip([chars])

후행 문자가 제거된 문자열의 복사본을 반환합니다. chars 인수는 제거할 문자 집합을 지정하는 문자열입니다. 생략하거나 None인 경우 chars 인수는 기본적으로 공백을 제거합니다. chars 인수는 접미사가 아닙니다. 오히려 해당 값의 모든 조합이 제거됩니다.

>>> '   spacious   '.rstrip()
'   spacious'
>>> 'mississippi'.rstrip('ipz')
'mississ'

모든 문자 집합이 아닌 단일 접미사 문자열을 제거하는 메서드는 str.removesuffix()를 참조하십시오. 예를 들어:

>>> 'Monty Python'.rstrip(' Python')
'M'
>>> 'Monty Python'.removesuffix(' Python')
'Monty'

str.split(sep=Nonemaxsplit=- 1)

구분 기호 문자열로 sep를 사용하여 문자열의 단어 목록을 반환합니다. maxsplit이 제공되면 최대 maxsplit 분할이 수행됩니다(따라서 목록에는 최대 maxsplit+1 요소가 포함됨). maxsplit이 지정되지 않았거나 -1이면 분할 수에 제한이 없습니다(가능한 모든 분할이 이루어짐).

sep가 제공되면 연속 구분 기호가 함께 그룹화되지 않고 빈 문자열을 구분하는 것으로 간주됩니다(예: ‘1,,2’.split(‘,’)는 [‘1’, ”, ‘2’]를 반환함). sep 인수는 여러 문자로 구성될 수 있습니다(예: ‘1<>2<>3’.split(‘<>’)는 [‘1’, ‘2’, ‘3’]을 반환함). 빈 문자열을 지정된 구분 기호로 나누면 [”]가 반환됩니다.

예를 들어

>>> '1,2,3'.split(',')
['1', '2', '3']
>>> '1,2,3'.split(',', maxsplit=1)
['1', '2,3']
>>> '1,2,,3,'.split(',')
['1', '2', '', '3', '']

sep가 지정되지 않았거나 None이면 다른 분할 알고리즘이 적용됩니다. 연속된 공백 실행은 단일 구분 기호로 간주되며 문자열에 선행 또는 후행 공백이 있는 경우 결과의 시작 또는 끝에 빈 문자열이 포함되지 않습니다. 결과적으로 빈 문자열이나 없음 구분 기호가 있는 공백으로만 구성된 문자열을 분할하면 []가 반환됩니다.

예를 들어:

>>> '1 2 3'.split()
['1', '2', '3']
>>> '1 2 3'.split(maxsplit=1)
['1', '2 3']
>>> '   1   2   3   '.split()
['1', '2', '3']

str.splitlines(keepends=False)

줄 경계에서 끊어지는 문자열의 줄 목록을 반환합니다. keepends가 제공되고 true가 아니면 결과 목록에 줄바꿈이 포함되지 않습니다.

이 방법은 다음 라인 경계에서 분할합니다. 특히 경계는 범용 줄 바꿈의 상위 집합입니다.

RepresentationDescription
\n줄바꿈
\r줄바꿈
\r\n캐리지 리턴 + 라인 피드
\v or \x0b라인 표
\f or \x0c양식 피드
\x1c파일 구분자
\x1d그룹 구분 기호
\x1e기록 분리기
\x85다음 줄(C1 제어 코드)
\u2028줄 구분 기호
\u2029단락 구분 기호

버전 3.2에서 변경: \v 및 \f가 줄 경계 목록에 추가되었습니다.

예를 들어:

>>> 'ab c\n\nde fg\rkl\r\n'.splitlines()
['ab c', '', 'de fg', 'kl']
>>> 'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True)
['ab c\n', '\n', 'de fg\r', 'kl\r\n']

구분 기호 문자열 sep가 제공될 때 split()과 달리 이 메서드는 빈 문자열에 대해 빈 목록을 반환하고 터미널 줄 바꿈으로 인해 추가 줄이 생성되지 않습니다.

>>> "".splitlines()
[]
>>> "One line\n".splitlines()
['One line']

비교를 위해 split(‘\n’)은 다음을 제공합니다.

>>> ''.split('\n')
['']
>>> 'Two lines\n'.split('\n')
['Two lines', '']

str.startswith(prefix[, start[, end]])

문자열이 접두사로 시작하면 True를 반환하고 그렇지 않으면 False를 반환합니다. 접두사는 찾을 접두사의 튜플일 수도 있습니다. 선택적 시작을 사용하면 해당 위치에서 시작하는 테스트 문자열입니다. 선택적 끝으로 해당 위치에서 문자열 비교를 중지합니다.

str.strip([chars])

선행 및 후행 문자가 제거된 문자열의 복사본을 반환합니다. chars 인수는 제거할 문자 집합을 지정하는 문자열입니다. 생략하거나 None인 경우 chars 인수는 기본적으로 공백을 제거합니다. chars 인수는 접두사 또는 접미사가 아닙니다. 오히려 해당 값의 모든 조합이 제거됩니다.

>>> '   spacious   '.strip()
'spacious'
>>> 'www.example.com'.strip('cmowz.')
'example'

가장 바깥쪽 선행 및 후행 chars 인수 값은 문자열에서 제거됩니다. 문자는 chars의 문자 세트에 포함되지 않은 문자열 문자에 도달할 때까지 선행 끝에서 제거됩니다. 비슷한 작업이 후단에서 발생합니다. 예를 들어:

>>> comment_string = '#....... Section 3.2.1 Issue #32 .......'
>>> comment_string.strip('.#! ')
'Section 3.2.1 Issue #32'

str.swapcase()

대문자가 소문자로 또는 그 반대로 변환된 문자열의 복사본을 반환합니다. s.swapcase().swapcase() == s가 반드시 참인 것은 아닙니다.

str.title()

단어가 대문자로 시작하고 나머지 문자는 소문자인 문자열의 제목이 있는 버전을 반환합니다.

예를 들어:

>>> 'Hello world'.title()
'Hello World'

알고리즘은 연속 문자 그룹으로 단어의 간단한 언어 독립적 정의를 사용합니다. 이 정의는 많은 맥락에서 작동하지만 축약형 및 소유격의 아포스트로피가 단어 경계를 형성하며 이는 원하는 결과가 아닐 수 있음을 의미합니다.

>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"

string.capwords() 함수는 공백에서만 단어를 분할하므로 이 문제가 없습니다.

또는 정규식을 사용하여 아포스트로피에 대한 해결 방법을 구성할 수 있습니다.

>>> import re
>>> def titlecase(s):
...     return re.sub(r"[A-Za-z]+('[A-Za-z]+)?",
...                   lambda mo: mo.group(0).capitalize(),
...                   s)
... 
>>> titlecase("they're bill's friends.")
"They're Bill's Friends."

str.translate(table)

주어진 번역표를 통해 각 문자가 매핑된 문자열의 복사본을 반환합니다. 테이블은 __getitem__(), 일반적으로 매핑 또는 시퀀스를 통해 인덱싱을 구현하는 객체여야 합니다. 유니코드 서수(정수)로 인덱싱할 때 테이블 개체는 다음 중 하나를 수행할 수 있습니다. 유니코드 서수 또는 문자열을 반환하여 문자를 하나 이상의 다른 문자에 매핑합니다. return None, 반환 문자열에서 문자를 삭제합니다. 또는 LookupError 예외를 발생시켜 문자를 자신에게 매핑합니다.

str.maketrans()를 사용하여 다양한 형식의 문자 간 매핑에서 변환 맵을 만들 수 있습니다.

사용자 지정 문자 매핑에 대한 보다 유연한 접근 방식은 codecs 모듈을 참조하십시오.

str.upper()

모든 케이스 문자 4를 대문자로 변환한 문자열의 복사본을 반환합니다. s.upper().isupper()는 s에 대소문자가 없는 문자가 포함되어 있거나 결과 문자의 유니코드 범주가 “Lu”(Letter, 대문자)가 아닌 경우 False일 수 있습니다. “Lt”(레터, 제목 케이스).

사용된 대문자 알고리즘은 유니코드 표준의 섹션 3.13에 설명되어 있습니다.

str.zfill(width)

길이 너비의 문자열을 만들기 위해 ASCII ‘0’ 숫자로 채워진 왼쪽 문자열의 복사본을 반환합니다. 선행 기호 접두사(‘+’/’-‘)는 패딩을 기호 문자 앞이 아닌 뒤에 삽입하여 처리됩니다. 너비가 len(s)보다 작거나 같으면 원래 문자열이 반환됩니다.

예를 들어:

>>> "42".zfill(5)
'00042'
>>> "-42".zfill(5)
'-0042'

printf-style String Formatting

참고: 여기에 설명된 서식 지정 작업은 여러 일반적인 오류(예: 튜플 및 사전을 올바르게 표시하지 못함)로 이어지는 다양한 문제를 나타냅니다. 최신 형식의 문자열 리터럴, str.format() 인터페이스 또는 템플릿 문자열을 사용하면 이러한 오류를 방지하는 데 도움이 될 수 있습니다. 이러한 각 대안은 단순성, 유연성 및/또는 확장성이라는 장점과 절충점을 제공합니다.

문자열 개체에는 % 연산자(modulo)라는 고유한 내장 연산이 하나 있습니다. 이것은 문자열 포매팅 또는 보간 연산자라고도 합니다. 형식 % 값이 주어지면(여기서 형식은 문자열임), 형식의 % 변환 사양은 값의 0개 이상의 요소로 대체됩니다. 그 효과는 C 언어에서 sprintf()를 사용하는 것과 비슷합니다.

형식에 단일 인수가 필요한 경우 값은 튜플이 아닌 단일 객체일 수 있습니다. 5 그렇지 않으면 값은 형식 문자열 또는 단일 매핑 개체(예: 사전)에 의해 지정된 항목 수와 정확히 일치하는 튜플이어야 합니다.

변환 지정자는 두 개 이상의 문자를 포함하며 다음 구성 요소가 있으며 이 순서로 발생해야 합니다.

  1. 지정자의 시작을 표시하는 ‘%’ 문자.
  2. 괄호로 묶인 일련의 문자(예: (somename))로 구성된 매핑 키(선택 사항).
  3. 일부 변환 유형의 결과에 영향을 미치는 변환 플래그(선택 사항).
  4. 최소 필드 너비(선택 사항). ‘*'(별표)로 지정된 경우 값의 튜플의 다음 요소에서 실제 너비를 읽고 변환할 개체는 최소 필드 너비와 선택적 정밀도 뒤에 옵니다.
  5. 정밀도(선택 사항), ‘.’로 지정됨 (점) 다음에 정밀도가 옵니다. ‘*'(별표)로 지정된 경우 값의 튜플의 다음 요소에서 실제 정밀도를 읽고 변환할 값이 정밀도 뒤에 옵니다.
  6. 길이 수정자(선택 사항).
  7. 전환 유형.

올바른 인수가 사전(또는 다른 매핑 유형)인 경우 문자열의 형식에는 ‘%’ 문자 바로 뒤에 삽입된 해당 사전에 대한 괄호로 묶인 매핑 키가 포함되어야 합니다. 매핑 키는 매핑에서 형식화할 값을 선택합니다. 예를 들어:

>>> print('%(language)s has %(number)03d quote types.' %
...       {'language': "Python", "number": 2})
Python has 002 quote types.

이 경우 형식에 * 지정자가 없을 수 있습니다(순차 매개변수 목록이 필요하기 때문).

변환 플래그 문자는 다음과 같습니다.

FlagMeaning
'#'값 변환은 “대체 형식”(아래에 정의됨)을 사용합니다.
'0'변환은 숫자 값에 대해 0으로 채워집니다.
'-'변환된 값은 왼쪽으로 조정됩니다(둘 다 제공되는 경우 ‘0’ 변환을 무시함).
' '(공백) 부호 있는 변환으로 생성된 양수(또는 빈 문자열) 앞에는 공백이 있어야 합니다.
'+'부호 문자(‘+’ 또는 ‘-‘)가 변환보다 우선합니다(“공백” 플래그를 재정의함).

길이 수정자(h, l 또는 L)가 있을 수 있지만 Python에 필요하지 않으므로 무시됩니다. %ld은(는) %d와 동일합니다.

전환 유형은 다음과 같습니다.

ConversionMeaningNotes
'd'부호 있는 정수 십진수.
'i'부호 있는 정수 십진수.
'o'부호 있는 8진수 값.(1)
'u'폐기된 유형 – ‘d’와 동일합니다.(6)
'x'부호 있는 16진수(소문자).(2)
'X'부호 있는 16진수(대문자).(2)
'e'부동 소수점 지수 형식(소문자).(3)
'E'부동 소수점 지수 형식(대문자).(3)
'f'부동 소수점 10진수 형식.(3)
'F'부동 소수점 10진수 형식.(3)
'g'부동 소수점 형식. 지수가 -4보다 작거나 정밀도보다 작지 않으면 소문자 지수 형식을 사용하고 그렇지 않으면 십진수 형식을 사용합니다.(4)
'G'부동 소수점 형식. 지수가 -4보다 작거나 정밀도보다 작지 않으면 대문자 지수 형식을 사용하고 그렇지 않으면 십진수 형식을 사용합니다.(4)
'c'단일 문자(정수 또는 단일 문자열 허용).
'r'문자열(repr()을 사용하여 Python 객체를 변환함).(5)
's'문자열(str()을 사용하여 Python 객체를 변환함).(5)
'a'문자열(ascii()를 사용하여 Python 객체를 변환함).(5)
'%'인수가 변환되지 않고 결과에 ‘%’ 문자가 표시됩니다.

노트:

  1. 대체 형식을 사용하면 선행 8진수 지정자(‘0o’)가 첫 번째 숫자 앞에 삽입됩니다.
  2. 대체 형식을 사용하면 선행 ‘0x’ 또는 ‘0X'(‘x’ 또는 ‘X’ 형식이 사용되었는지 여부에 따라 다름)가 첫 번째 숫자 앞에 삽입됩니다.
  3. 대체 형식을 사용하면 뒤에 숫자가 없더라도 결과에 항상 소수점이 포함됩니다.
  4. 정밀도는 소수점 이하 자릿수를 결정하며 기본값은 6입니다.
  5. 대체 형식을 사용하면 결과에 항상 소수점이 포함되며 후행 0은 제거되지 않습니다.
  6. 정밀도는 소수점 전후의 유효 자릿수를 결정하며 기본값은 6입니다.
  7. 정밀도가 N이면 출력이 N자로 잘립니다.
  8. PEP 237 참조.

Python 문자열에는 명시적인 길이가 있으므로 %s 변환은 ‘\0’이 문자열의 끝이라고 가정하지 않습니다.

버전 3.1에서 변경: 절대값이 1e50을 초과하는 숫자에 대한 %f 변환은 더 이상 %g 변환으로 대체되지 않습니다.

Source: https://docs.python.org/3/library/stdtypes.html

Python Built-in Constants

기본 제공 네임스페이스에는 소수의 상수가 있습니다. 그들은:

False

부울 유형의 거짓 값입니다. False에 대한 할당은 불법이며 SyntaxError를 발생시킵니다.

True

bool 유형의 참 값입니다. True에 대한 할당은 불법이며 SyntaxError를 발생시킵니다.

None

기본 인수가 함수에 전달되지 않는 경우와 같이 값이 없음을 나타내는 데 자주 사용되는 개체입니다. None에 할당하는 것은 불법이며 SyntaxError를 일으킵니다. None은 NoneType 유형의 유일한 인스턴스입니다.

NotImplemented

작업이 다른 유형과 관련하여 구현되지 않았음을 나타내기 위해 바이너리 특수 메서드(예: __eq__(), __lt__(), __add__(), __rsub__() 등)에서 반환되어야 하는 특수 값입니다. 동일한 목적을 위해 내부 바이너리 특수 메서드(예: __imul__(), __iand__() 등)에 의해 반환될 수 있습니다. 부울 컨텍스트에서 평가하면 안 됩니다. NotImplemented는 types.NotImplementedType 유형의 유일한 인스턴스입니다.

참고 이진(또는 내부) 메서드가 NotImplemented를 반환하면 인터프리터는 다른 유형(또는 연산자에 따라 일부 다른 폴백)에 반영된 작업을 시도합니다. 모든 시도가 NotImplemented를 반환하면 인터프리터는 적절한 예외를 발생시킵니다. NotImplemented를 잘못 반환하면 잘못된 오류 메시지가 표시되거나 NotImplemented 값이 Python 코드로 반환됩니다.
예제는 Implementing the arithmetic operations을 참조하세요.

참고 NotImplementedError와 NotImplemented는 이름과 용도가 비슷하더라도 서로 바꿔 사용할 수 없습니다. 사용 시기에 대한 자세한 내용은 NotImplementedError를 참조하세요.

버전 3.9에서 변경: 부울 컨텍스트에서 NotImplemented를 평가하는 것은 더 이상 사용되지 않습니다. 현재 true로 평가되는 동안 DeprecationWarning을 내보냅니다. 미래 버전의 Python에서는 TypeError가 발생합니다.

Ellipsis

줄임표 리터럴 “…”과 동일합니다. 사용자 정의 컨테이너 데이터 유형에 대한 확장 슬라이싱 구문과 함께 주로 사용되는 특수 값입니다. Ellipsis는 types.EllipsisType 유형의 유일한 인스턴스입니다.

__debug__

이 상수는 Python이 -O 옵션으로 시작되지 않은 경우에 참입니다. assert 문도 참조하십시오.

참고 None, False, True 및 __debug__ 이름은 재할당할 수 없으므로(속성 이름으로 지정하더라도 SyntaxError가 발생함) “참” 상수로 간주될 수 있습니다.

Constants added by the site module

사이트 모듈(-S 명령줄 옵션이 지정된 경우를 제외하고 시작하는 동안 자동으로 가져옴)은 내장 네임스페이스에 여러 상수를 추가합니다. 대화형 인터프리터 셸에 유용하며 프로그램에서 사용하면 안 됩니다.

quit(code=None)
exit(code=None)

인쇄될 때 “종료하려면 quit() 또는 Ctrl-D(즉, EOF)를 사용하십시오”와 같은 메시지를 인쇄하고 호출될 때 지정된 종료 코드로 SystemExit를 발생시키는 객체.

copyright
credits

인쇄하거나 호출할 때 각각 저작권 또는 크레딧 텍스트를 인쇄하는 개체입니다.

license

인쇄 시 “전체 라이센스 텍스트를 보려면 License()를 입력하십시오”라는 메시지를 인쇄하고 호출 시 전체 라이센스 텍스트를 호출기와 같은 방식(한 번에 한 화면)으로 표시하는 개체입니다.

Source: https://docs.python.org/3/library/constants.html

Python Built-in Functions

Python 인터프리터에는 항상 사용할 수 있는 여러 함수와 유형이 내장되어 있습니다. 여기에는 알파벳순으로 나열되어 있습니다.

내장 함수:

A
abs()
aiter()
all()
any()
anext()
ascii()

B
bin()
bool()
breakpoint()
bytearray()
bytes()

C
callable()
chr()
classmethod()
compile()
complex()

D
delattr()
dict()
dir()
divmod()

E
enumerate()
eval()
exec()

F
filter()
float()
format()
frozenset()

G
getattr()
globals()

H
hasattr()
hash()
help()
hex()

I
id()
input()
int()
isinstance()
issubclass()
iter()
L
len()
list()
locals()

M
map()
max()
memoryview()
min()

N
next()

O
object()
oct()
open()
ord()

P
pow()
print()
property()




R
range()
repr()
reversed()
round()

S
set()
setattr()
slice()
sorted()
staticmethod()
str()
sum()
super()

T
tuple()
type()

V
vars()

Z
zip()

_
__import__()

abs(x)

숫자의 절대값을 반환합니다. 인수는 정수, 부동 소수점 숫자 또는 __abs__()를 구현하는 객체일 수 있습니다. 인수가 복소수이면 크기가 반환됩니다.

aiter(async_iterable)

비동기 이터러블에 대한 비동기 이터레이터를 반환합니다. x.__aiter__()를 호출하는 것과 같습니다.

참고: iter()와 달리 aiter()에는 2인수 변형이 없습니다.
버전 3.10의 새로운 기능.

all(iterable)

iterable의 모든 요소가 참이면(또는 iterable이 비어 있으면) True를 반환합니다. 다음과 같음:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

awaitable anext(async_iterator)
awaitable anext(async_iteratordefault)

기다리면 주어진 비동기 이터레이터에서 다음 항목을 반환하거나, 주어진 경우 기본값을 반환하고 이터레이터가 소진되었습니다.

이것은 next() 내장 함수의 비동기 변형이며 유사하게 동작합니다.

이는 awaitable을 반환하는 async_iterator의 __anext__() 메서드를 호출합니다. 이것을 기다리면 반복자의 다음 값이 반환됩니다. 기본값이 주어지면 반복자가 소진되면 반환되고, 그렇지 않으면 StopAsyncIteration이 발생합니다.

버전 3.10의 새로운 기능.

any(iterable)

iterable의 요소가 참이면 True를 반환합니다. iterable이 비어 있으면 False를 반환합니다. 다음과 같음:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

ascii(object)

repr()로 객체의 인쇄 가능한 표현을 포함하는 문자열을 반환하지만 \x, \u 또는 \U 이스케이프를 사용하여 repr()이 반환하는 문자열에서 ASCII가 아닌 문자를 이스케이프합니다. 이것은 Python 2에서 repr()이 반환한 것과 유사한 문자열을 생성합니다.

bin(x)

정수를 “0b” 접두사가 붙은 이진 문자열로 변환합니다. 결과는 유효한 Python 표현식입니다. x가 Python int 객체가 아니면 정수를 반환하는 __index__() 메서드를 정의해야 합니다. 몇 가지 예:

>>> bin(3)
'0b11'
>>> bin(-10)
'-0b1010'

접두사 “0b”가 필요한 경우 다음 방법 중 하나를 사용할 수 있습니다.

>>> format(14, '#b'), format(14, 'b')
('0b1110', '1110')
>>> f'{14:#b}', f'{14:b}'
('0b1110', '1110')

자세한 내용은 format()도 참조하십시오.

class bool(x=False)

부울 값, 즉 True 또는 False 중 하나를 반환합니다. x는 표준 진리 테스트 절차를 사용하여 변환됩니다. x가 false이거나 생략되면 False를 반환합니다. 그렇지 않으면 True를 반환합니다. bool 클래스는 int의 하위 클래스입니다(숫자 유형 — int, float, complex 참조). 더 이상 하위 클래스로 분류할 수 없습니다. 유일한 인스턴스는 False 및 True입니다(부울 값 참조).

버전 3.7에서 변경: x는 이제 위치 전용 매개변수입니다.

breakpoint(*args**kws)

이 함수는 호출 사이트에서 디버거로 이동합니다. 특히 sys.breakpointhook()를 호출하여 args와 kws를 바로 전달합니다. 기본적으로 sys.breakpointhook()는 인수를 기대하지 않고 pdb.set_trace()를 호출합니다. 이 경우 순전히 편의 기능이므로 pdb를 명시적으로 가져오거나 디버거에 들어가기 위해 많은 코드를 입력할 필요가 없습니다. 그러나 sys.breakpointhook()는 다른 함수로 설정할 수 있으며 breakpoint()는 자동으로 해당 함수를 호출하여 선택한 디버거에 드롭할 수 있습니다. sys.breakpointhook()에 액세스할 수 없는 경우 이 함수는 RuntimeError를 발생시킵니다.

breakpointhook 인수를 사용하여 감사 이벤트 builtins.breakpoint를 발생시킵니다.

버전 3.7의 새로운 기능.

class bytearray(source=b”)
class bytearray(sourceencoding)
class bytearray(sourceencodingerrors)

새로운 바이트 배열을 반환합니다. bytearray 클래스는 0 <= x < 256 범위에 있는 정수의 변경 가능한 시퀀스입니다. 변경 가능한 시퀀스 유형에 설명된 변경 가능한 시퀀스의 일반적인 메서드와 바이트 유형이 갖는 대부분의 메서드가 있습니다. 바이트 및 바이트 배열 작업.

선택적 source 매개 변수를 사용하여 몇 가지 다른 방법으로 어레이를 초기화할 수 있습니다.

  • 문자열인 경우 인코딩(및 선택적으로 오류) 매개변수도 제공해야 합니다. bytearray()는 str.encode()를 사용하여 문자열을 바이트로 변환합니다.
  • 정수인 경우 배열은 해당 크기를 가지며 null 바이트로 초기화됩니다.
  • 버퍼 인터페이스를 준수하는 객체인 경우 객체의 읽기 전용 버퍼가 바이트열 배열을 초기화하는 데 사용됩니다.
  • 이터러블인 경우 배열의 초기 내용으로 사용되는 0 <= x < 256 범위의 정수로 구성된 이터러블이어야 합니다.

인수가 없으면 크기가 0인 배열이 생성됩니다.

Binary Sequence Types — bytes, bytearray, memoryview 및 Bytearray 객체도 참조하십시오.

class bytes(source=b”)
class bytes(source, encoding)
class bytes(source, encoding, errors)

0 <= x < 256 범위의 불변 정수 시퀀스인 새로운 “바이트” 객체를 반환합니다. 바이트는 바이트 배열의 불변 버전입니다. 동일한 비변형 메서드와 동일한 인덱싱 및 슬라이싱 동작을 가집니다.

따라서 생성자 인수는 bytearray()와 같이 해석됩니다.

바이트 개체는 리터럴을 사용하여 만들 수도 있습니다. 문자열 및 바이트 리터럴을 참조하십시오.

Binary Sequence Types — bytes, bytearray, memoryview, Bytes 객체, Bytes 및 Bytearray 연산도 참조하십시오.

callable(object)

객체 인수가 호출 가능한 것처럼 보이면 True를 반환하고 그렇지 않으면 False를 반환합니다. 이것이 True를 반환하면 여전히 호출이 실패할 가능성이 있지만 False이면 개체 호출이 성공하지 못합니다. 클래스는 호출 가능합니다(클래스를 호출하면 새 인스턴스가 반환됨). 클래스에 __call__() 메서드가 있으면 인스턴스를 호출할 수 있습니다.

버전 3.2의 새로운 기능: 이 함수는 Python 3.0에서 처음 제거된 다음 Python 3.2에서 다시 가져왔습니다.

chr(i)

유니코드 코드 포인트가 정수 i인 문자를 나타내는 문자열을 반환합니다. 예를 들어 chr(97)은 문자열 ‘a’를 반환하고 chr(8364)는 문자열 ‘€’를 반환합니다. 이것은 ord()의 반대입니다.

인수의 유효한 범위는 0에서 1,114,111까지입니다(16진수에서 0x10FFFF). i가 해당 범위를 벗어나면 ValueError가 발생합니다.

@classmethod

메서드를 클래스 메서드로 변환합니다.

인스턴스 메서드가 인스턴스를 받는 것처럼 클래스 메서드는 암시적 첫 번째 인수로 클래스를 받습니다. 클래스 메서드를 선언하려면 다음 관용구를 사용하세요.

class C:
    @classmethod
    def f(cls, arg1, arg2): ...

@classmethod 형식은 함수 데코레이터입니다. 자세한 내용은 함수 정의를 참조하세요.

클래스 메서드는 클래스(예: C.f()) 또는 인스턴스(예: C().f())에서 호출할 수 있습니다. 해당 클래스를 제외하고 인스턴스는 무시됩니다. 파생 클래스에 대해 클래스 메서드가 호출되면 파생 클래스 개체가 암시된 첫 번째 인수로 전달됩니다.

클래스 메서드는 C++ 또는 Java 정적 메서드와 다릅니다. 원하는 경우 이 섹션의 staticmethod()를 참조하십시오. 클래스 메서드에 대한 자세한 내용은 표준 유형 계층을 참조하세요.

버전 3.9에서 변경: 클래스 메서드는 이제 property()와 같은 다른 descriptors를 래핑할 수 있습니다.

버전 3.10에서 변경: 클래스 메서드는 이제 메서드 속성(__module__, __name__, __qualname__, __doc__ 및 __annotations__)을 상속하고 새로운 __wrapped__ 속성을 갖습니다.

버전 3.11에서 변경: 클래스 메서드는 더 이상 property()와 같은 다른 descriptors를 래핑할 수 없습니다.

compile(source, filename, mode, flags=0, dont_inherit=False, optimize=- 1)

소스를 코드 또는 AST 개체로 컴파일합니다. 코드 객체는 exec() 또는 eval()에 의해 실행될 수 있습니다. source는 일반 문자열, 바이트 문자열 또는 AST 개체일 수 있습니다. AST 객체로 작업하는 방법에 대한 정보는 ast 모듈 설명서를 참조하십시오.

filename 인수는 코드를 읽은 파일을 제공해야 합니다. 파일에서 읽지 않은 경우 인식할 수 있는 값을 전달합니다(‘<문자열>’이 일반적으로 사용됨).

mode 인수는 어떤 종류의 코드를 컴파일해야 하는지 지정합니다. 소스가 일련의 명령문으로 구성된 경우 ‘exec’, 단일 표현식으로 구성된 경우 ‘eval’, 단일 대화식 명령문(후자의 경우 무언가로 평가되는 표현식 명령문)으로 구성된 경우 ‘single’이 될 수 있습니다. None 이외는 인쇄됩니다).

선택적 인수 flags 및 dont_inherit는 활성화되어야 하는 컴파일러 옵션과 허용되어야 하는 향후 기능을 제어합니다. 둘 다 존재하지 않거나 둘 다 0인 경우 코드는 compile()을 호출하는 코드에 영향을 주는 동일한 플래그로 컴파일됩니다. flags 인수가 제공되고 dont_inherit가 아닌 경우(또는 0인 경우) flags 인수로 지정된 퓨처 문과 컴파일러 옵션이 사용됩니다. dont_inherit가 0이 아닌 정수이면 flags 인수는 그것입니다. 주변 코드의 플래그(향후 기능 및 컴파일러 옵션)는 무시됩니다.

컴파일러 옵션과 퓨처 문은 여러 옵션을 지정하기 위해 함께 비트 OR로 연결될 수 있는 비트로 지정됩니다. 주어진 미래 기능을 지정하는 데 필요한 비트 필드는 __future__ 모듈의 _Feature 인스턴스에서 compiler_flag 속성으로 찾을 수 있습니다. 컴파일러 플래그는 PyCF_ 접두사와 함께 ast 모듈에서 찾을 수 있습니다.

인수 optimize는 컴파일러의 최적화 수준을 지정합니다. 기본값 -1은 -O 옵션으로 주어진 인터프리터의 최적화 수준을 선택합니다. 명시적 수준은 0(최적화 없음, __debug__가 참), 1(어설션이 제거됨, __debug__가 거짓임) 또는 2(독스트링도 제거됨)입니다.

이 함수는 컴파일된 소스가 유효하지 않으면 SyntaxError 를 발생시키고, 소스에 null 바이트가 포함되어 있으면 ValueError 를 발생시킵니다.

Python 코드를 AST 표현으로 구문 분석하려면 ast.parse()를 참조하십시오.

source 및 filename 인수를 사용하여 감사 이벤트 컴파일을 발생시킵니다. 이 이벤트는 암시적 컴파일에 의해 발생할 수도 있습니다.

참고: ‘single’ 또는 ‘eval’ 모드에서 여러 줄 코드로 문자열을 컴파일할 때 입력은 적어도 하나의 개행 문자로 종료되어야 합니다. 이는 code 모듈에서 불완전하고 완전한 문을 쉽게 감지하기 위한 것입니다.

경고: Python AST 컴파일러의 스택 깊이 제한으로 인해 AST 객체로 컴파일할 때 충분히 크고 복잡한 문자열로 Python 인터프리터를 충돌시킬 수 있습니다.

버전 3.2에서 변경: Windows 및 Mac 줄바꿈 사용이 허용되었습니다. 또한 ‘exec’ 모드의 입력은 더 이상 새 줄로 끝나지 않아도 됩니다. 최적화 매개변수를 추가했습니다.

버전 3.5에서 변경: 이전에는 소스에서 null 바이트가 발견되면 TypeError가 발생했습니다.

버전 3.8의 새로운 기능: 이제 ast.PyCF_ALLOW_TOP_LEVEL_AWAIT를 플래그로 전달하여 최상위 await, async for 및 async with를 지원할 수 있습니다.

class complex(real=0, imag=0)
class complex(string)

값이 real + imag*1j인 복소수를 반환하거나 문자열 또는 숫자를 복소수로 변환합니다. 첫 번째 매개변수가 문자열이면 복소수로 해석되며 두 번째 매개변수 없이 함수를 호출해야 합니다. 두 번째 매개변수는 문자열이 될 수 없습니다. 각 인수는 모든 숫자 유형(복소수 포함)일 수 있습니다. imag가 생략되면 기본값은 0이고 생성자는 int 및 float와 같은 숫자 변환 역할을 합니다. 두 인수가 모두 생략되면 0j를 반환합니다.

일반 파이썬 객체 x의 경우, complex(x)는 x.__complex__()에 위임합니다. __complex__()가 정의되어 있지 않으면 __float__()로 돌아갑니다. __float__()가 정의되지 않은 경우 __index__()로 돌아갑니다.

참고: 문자열에서 변환할 때 문자열은 중앙 + 또는 – 연산자 주위에 공백을 포함하지 않아야 합니다. 예를 들어, complex(‘1+2j’)는 괜찮지만 complex(‘1 + 2j’)는 ValueError를 발생시킵니다.

복잡한 유형은 숫자 유형 — int, float, complex에 설명되어 있습니다.

버전 3.6에서 변경: 코드 리터럴에서와 같이 밑줄로 숫자를 그룹화하는 것이 허용됩니다.

버전 3.8에서 변경: __complex__() 및 __float__()가 정의되지 않은 경우 __index__()로 돌아갑니다.

delattr(object, name)

이것은 setattr()의 친척입니다. 인수는 객체와 문자열입니다. 문자열은 객체 속성 중 하나의 이름이어야 합니다. 개체가 허용하는 경우 함수는 명명된 특성을 삭제합니다. 예를 들어, delattr(x, ‘foobar’)는 del x.foobar와 동일합니다. 이름은 파이썬 식별자일 필요가 없습니다(setattr() 참조).

class dict(**kwarg)
class dict(mapping, **kwarg)
class dict(iterable, **kwarg)

새 dictionary를 만듭니다. dict 객체는 사전 클래스입니다. 이 클래스에 대한 문서는 dict 및 매핑 유형 — dict를 참조하십시오.

다른 컨테이너의 경우 내장 목록, 집합 및 튜플 클래스와 collections 모듈을 참조하십시오.

dir()
dir(object)

인수가 없으면 현재 로컬 범위의 이름 목록을 반환합니다. 인수를 사용하여 해당 개체에 대한 유효한 속성 목록을 반환하려고 시도합니다.

객체에 __dir__()이라는 메서드가 있으면 이 메서드가 호출되고 속성 목록을 반환해야 합니다. 이를 통해 사용자 정의 __getattr__() 또는 __getattribute__() 함수를 구현하는 객체가 dir()이 속성을 보고하는 방식을 사용자 정의할 수 있습니다.

객체가 __dir__()을 제공하지 않으면 함수는 객체의 __dict__ 어트리뷰트(정의된 경우)와 해당 유형 객체에서 정보를 수집하기 위해 최선을 다합니다. 결과 목록은 반드시 완전하지는 않으며 개체에 사용자 지정 __getattr__()이 있는 경우 정확하지 않을 수 있습니다.

기본 dir() 메커니즘은 완전한 정보가 아니라 가장 관련성이 높은 정보를 생성하려고 시도하므로 객체 유형에 따라 다르게 작동합니다.

객체가 모듈 객체인 경우 목록에는 모듈 속성의 이름이 포함됩니다.

객체가 유형 또는 클래스 객체인 경우 목록에는 해당 속성의 이름과 기본 속성의 재귀적 이름이 포함됩니다.

그렇지 않으면 목록에는 객체의 속성 이름, 해당 클래스의 속성 이름 및 재귀적으로 해당 클래스의 기본 클래스 속성이 포함됩니다.

결과 목록은 사전순으로 정렬됩니다. 예를 들어:

>>> import struct
>>> dir()   # show the names in the module namespace  
['__builtins__', '__name__', 'struct']
>>> dir(struct)   # show the names in the struct module 
['Struct', '__all__', '__builtins__', '__cached__', '__doc__', '__file__',
 '__initializing__', '__loader__', '__name__', '__package__',
 '_clearcache', 'calcsize', 'error', 'pack', 'pack_into',
 'unpack', 'unpack_from']
>>> class Shape:
...     def __dir__(self):
...         return ['area', 'perimeter', 'location']
>>> s = Shape()
>>> dir(s)
['area', 'location', 'perimeter']

참고: dir()은 주로 대화식 프롬프트에서 사용하기 편리하도록 제공되기 때문에 엄격하거나 일관되게 정의된 이름 집합을 제공하려고 시도하는 것보다 흥미로운 이름 집합을 제공하려고 시도하며 자세한 동작은 릴리스 간에 변경될 수 있습니다. . 예를 들어 인수가 클래스인 경우 메타클래스 속성은 결과 목록에 없습니다.

divmod(a, b)

두 개의 (비복소수) 숫자를 인수로 취하고 정수 나누기를 사용할 때 몫과 나머지로 구성된 숫자 쌍을 반환합니다. 혼합 피연산자 유형을 사용하면 이진 산술 연산자에 대한 규칙이 적용됩니다. 정수의 경우 결과는 (a // b, a % b)와 동일합니다. 부동 소수점 숫자의 경우 결과는 (q, a % b)입니다. 여기서 q는 일반적으로 math.floor(a / b)이지만 그보다 1이 작을 수 있습니다. 어쨌든 q * b + a % b는 a에 매우 가깝습니다. a % b가 0이 아니면 b와 동일한 부호를 가지며 0 <= abs(a % b) < abs(b)입니다.

enumerate(iterable, start=0)

enumerate object를 반환합니다. iterable은 시퀀스, 반복자 또는 반복을 지원하는 다른 객체여야 합니다. enumerate()에 의해 반환된 이터레이터의 __next__() 메서드는 카운트(기본값은 0인 start부터)와 iterable을 반복하여 얻은 값을 포함하는 튜플을 반환합니다.

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

다음과 같음:

def enumerate(iterable, start=0):
    n = start
    for elem in iterable:
        yield n, elem
        n += 1

eval(expression, globals=None, locals=None)

인수는 문자열과 선택적 전역 및 지역입니다. 제공되는 경우 globals는 사전이어야 합니다. 제공되는 경우 locals는 모든 매핑 개체가 될 수 있습니다.

표현식 인수는 전역 및 지역 네임스페이스로 globals 및 locals 사전을 사용하여 Python 표현식(기술적으로 말하면 조건 목록)으로 구문 분석되고 평가됩니다. globals 사전이 있고 __builtins__ 키에 대한 값을 포함하지 않는 경우 내장 모듈 builtins의 사전에 대한 참조가 표현식이 구문 분석되기 전에 해당 키 아래에 삽입됩니다. 그렇게 하면 자신의 __builtins__ 사전을 eval()에 전달하기 전에 전역에 삽입하여 실행된 코드에 사용할 수 있는 내장 항목을 제어할 수 있습니다. locals 사전이 생략되면 기본적으로 globals 사전이 됩니다. 두 사전을 모두 생략하면 eval()이 호출되는 환경에서 전역 및 지역으로 표현식이 실행됩니다. eval()은 둘러싸는 환경에서 중첩된 범위(비로컬)에 액세스할 수 없습니다.

반환 값은 평가된 식의 결과입니다. 구문 오류는 예외로 보고됩니다. 예:

>>> x = 1
>>> eval('x+1')
2

이 함수는 또한 임의의 코드 객체(예: compile()에 의해 생성된 객체)를 실행하는 데 사용할 수 있습니다. 이 경우 문자열 대신 코드 개체를 전달합니다. 코드 객체가 모드 인수로 ‘exec’로 컴파일된 경우 eval()의 반환 값은 None이 됩니다.

힌트: 명령문의 동적 실행은 exec() 함수에 의해 지원됩니다. globals() 및 locals() 함수는 각각 eval() 또는 exec()에서 사용하기 위해 전달하는 데 유용할 수 있는 현재 전역 및 로컬 사전을 반환합니다.

주어진 소스가 문자열이면 선행 및 후행 공백과 탭이 제거됩니다.

리터럴만 포함하는 표현식으로 문자열을 안전하게 평가할 수 있는 함수는 ast.literal_eval()을 참조하십시오.

코드 개체를 인수로 사용하여 감사 이벤트 exec를 발생시킵니다. 코드 컴파일 이벤트도 발생할 수 있습니다.

exec(object, globals=None, locals=None, /, *, closure=None)

이 함수는 Python 코드의 동적 실행을 지원합니다. 객체는 문자열 또는 코드 객체여야 합니다. 문자열인 경우 문자열은 Python 문 모음으로 구문 분석된 다음 실행됩니다(구문 오류가 발생하지 않는 한). 1 코드 객체라면 간단히 실행된다. 모든 경우에 실행되는 코드는 파일 입력으로 유효할 것으로 예상됩니다(참조 설명서의 파일 입력 섹션 참조). nonlocal, yield 및 return 문은 exec() 함수에 전달된 코드 컨텍스트 내에서도 함수 정의 외부에서 사용할 수 없습니다. 반환 값은 없음입니다.

모든 경우에 선택적 부분이 생략되면 현재 범위에서 코드가 실행됩니다. 전역만 제공되는 경우 전역 및 지역 변수 모두에 사용되는 사전이어야 합니다(사전의 하위 클래스가 아님). globals와 locals가 주어지면 각각 전역 변수와 지역 변수에 사용됩니다. 제공되는 경우 locals는 모든 매핑 개체가 될 수 있습니다. 모듈 수준에서 globals와 locals는 동일한 사전임을 기억하십시오. exec가 두 개의 개별 개체를 전역 및 지역으로 가져오면 코드가 클래스 정의에 포함된 것처럼 실행됩니다.

전역 사전에 __builtins__ 키에 대한 값이 없으면 내장 모듈 builtins의 사전에 대한 참조가 해당 키 아래에 삽입됩니다. 그렇게 하면 exec()에 전달하기 전에 자신의 __builtins__ 사전을 전역에 삽입하여 실행된 코드에 사용할 수 있는 내장 항목을 제어할 수 있습니다.

클로저 인수는 클로저(cellvars의 튜플)를 지정합니다. 개체가 자유 변수를 포함하는 코드 개체인 경우에만 유효합니다. 튜플의 길이는 코드 객체가 참조하는 자유 변수의 수와 정확히 일치해야 합니다.

코드 개체를 인수로 사용하여 감사 이벤트 exec를 발생시킵니다. 코드 컴파일 이벤트도 발생할 수 있습니다.

참고: 내장 함수 globals() 및 locals()는 각각 현재 전역 및 로컬 사전을 반환하며, 이는 exec()의 두 번째 및 세 번째 인수로 사용하기 위해 전달하는 데 유용할 수 있습니다.

참고: 기본 로컬은 아래의 locals() 함수에 대해 설명된 대로 작동합니다. 기본 로컬 사전에 대한 수정을 시도해서는 안 됩니다. 함수 exec()가 반환된 후 지역에 대한 코드의 효과를 확인해야 하는 경우 명시적 지역 사전을 전달합니다.

버전 3.11에서 변경: 클로저 매개변수를 추가했습니다.

filter(function, iterable)

함수가 true를 반환하는 iterable의 요소에서 반복자를 생성합니다. iterable은 시퀀스, 반복을 지원하는 컨테이너 또는 반복자일 수 있습니다. function이 None이면 항등 함수가 가정됩니다. 즉, false인 iterable의 모든 요소가 제거됩니다.

filter(function, iterable)은 function이 None이 아니면 (item for iterable if function(item)인 경우 item for iterable if function(item)) 제너레이터 표현식(item for iterable if item)과 동등하고 function이 None이면 (item for iterable if item)과 동일합니다.

function이 false를 반환하는 iterable의 요소를 반환하는 보완 함수는 itertools.filterfalse()를 참조하세요.

class float(x=0.0)

숫자 또는 문자열 x로 구성된 부동 소수점 숫자를 반환합니다.

인수가 문자열인 경우 십진수를 포함해야 하며 선택적으로 부호가 앞에 오고 선택적으로 공백에 포함되어야 합니다. 선택적 기호는 ‘+’ 또는 ‘-‘일 수 있습니다. ‘+’ 기호는 생성된 값에 영향을 주지 않습니다. 인수는 NaN(숫자가 아님) 또는 양수 또는 음수 무한대를 나타내는 문자열일 수도 있습니다. 보다 정확하게는 선행 및 후행 공백 문자가 제거된 후 입력이 다음 문법의 floatvalue 생성 규칙을 준수해야 합니다.

sign        ::=  "+" | "-"
infinity    ::=  "Infinity" | "inf"
nan         ::=  "nan"
digitpart   ::=  digit (["_"] digit)*
number      ::=  [digitpart] "." digitpart | digitpart ["."]
exponent    ::=  ("e" | "E") ["+" | "-"] digitpart
floatnumber ::=  number [exponent]
floatvalue  ::=  [sign] (floatnumber | infinity | nan)

여기서 숫자는 유니코드 십진수(유니코드 일반 범주 Nd의 문자)입니다. 대소문자는 중요하지 않으므로 예를 들어 “inf”, “Inf”, “INFINITY” 및 “iNfINity”는 모두 양의 무한대에 허용되는 철자입니다.

그렇지 않고 인수가 정수이거나 부동 소수점 숫자이면 동일한 값(파이썬의 부동 소수점 정밀도 내)을 가진 부동 소수점 숫자가 반환됩니다. 인수가 Python float의 범위를 벗어나면 OverflowError가 발생합니다.

일반 Python 객체 x의 경우 float(x)는 x.__float__()에 위임합니다. __float__()가 정의되지 않은 경우 __index__()로 돌아갑니다.

인수를 지정하지 않으면 0.0이 반환됩니다.

예:

>>> float('+1.23')
1.23
>>> float('   -12345\n')
-12345.0
>>> float('1e-003')
0.001
>>> float('+1E6')
1000000.0
>>> float('-Infinity')
-inf

float 유형은 숫자 유형 — int, float, complex에 설명되어 있습니다.

버전 3.6에서 변경: 코드 리터럴에서와 같이 밑줄로 숫자를 그룹화하는 것이 허용됩니다.

버전 3.7에서 변경: x는 이제 위치 전용 매개변수입니다.

버전 3.8에서 변경: __float__()가 정의되지 않은 경우 __index__()로 돌아갑니다.

format(value, format_spec=”)

format_spec에 의해 제어되는 대로 값을 “포맷된” 표현으로 변환합니다. format_spec의 해석은 값 인수의 유형에 따라 다릅니다. 그러나 대부분의 기본 제공 유형에서 사용되는 표준 형식 지정 구문인 형식 사양 미니 언어가 있습니다.

기본 format_spec은 일반적으로 str(value)를 호출하는 것과 동일한 효과를 제공하는 빈 문자열입니다.

format(value, format_spec)에 대한 호출은 값의 __format__() 메서드를 검색할 때 인스턴스 사전을 우회하는 type(value).__format__(value, format_spec)으로 변환됩니다. 메서드 검색이 개체에 도달하고 format_spec이 비어 있지 않거나 format_spec 또는 반환 값이 문자열이 아닌 경우 TypeError 예외가 발생합니다.

버전 3.4에서 변경: object().__format__(format_spec)은 format_spec이 빈 문자열이 아니면 TypeError를 발생시킵니다.

class frozenset(iterable=set())

선택적으로 iterable에서 가져온 요소와 함께 새로운 frozenset 객체를 반환합니다. frozenset은 내장 클래스입니다. 이 클래스에 대한 문서는 frozenset 및 집합 유형 — set, frozenset을 참조하세요.

다른 컨테이너의 경우 내장된 set, list, tuple 및 dict 클래스와 collections 모듈을 참조하십시오.

getattr(object, name)
getattr(object, name, default)

객체의 명명된 속성 값을 반환합니다. 이름은 문자열이어야 합니다. 문자열이 객체 속성 중 하나의 이름인 경우 결과는 해당 속성의 값입니다. 예를 들어 getattr(x, ‘foobar’)는 x.foobar와 동일합니다. 명명된 속성이 존재하지 않는 경우 제공된 경우 기본값이 반환되고, 그렇지 않으면 AttributeError가 발생합니다. 이름은 파이썬 식별자일 필요가 없습니다(setattr() 참조).

참고: private name mangling은 컴파일 시간에 발생하므로 getattr()로 검색하려면 개인 속성(앞에 두 개의 밑줄이 있는 속성)의 이름을 수동으로 맹글링해야 합니다.

globals()

현재 모듈 네임스페이스를 구현하는 사전을 반환합니다. 함수 내 코드의 경우 함수가 정의될 때 설정되며 함수가 호출되는 위치에 관계없이 동일하게 유지됩니다.

hasattr(object, name)

인수는 객체와 문자열입니다. 문자열이 객체 속성 중 하나의 이름이면 결과는 True이고 그렇지 않으면 False입니다. (이것은 getattr(object, name)을 호출하고 AttributeError를 발생시키는지 여부를 확인하여 구현됩니다.)

hash(object)

객체의 해시 값을 반환합니다(해시 값이 있는 경우). 해시 값은 정수입니다. 사전 조회 중에 사전 키를 빠르게 비교하는 데 사용됩니다. 같다고 비교되는 숫자 값은 동일한 해시 값을 가집니다(1과 1.0의 경우처럼 유형이 다르더라도).

참고: 사용자 지정 __hash__() 메서드가 있는 객체의 경우 hash()는 호스트 시스템의 비트 너비를 기반으로 반환 값을 자릅니다. 자세한 내용은 __hash__()를 참조하십시오.

help()
help(request)

내장 도움말 시스템을 호출합니다. (이 기능은 대화식으로 사용하기 위한 것입니다.) 인수가 제공되지 않으면 인터프리터 콘솔에서 대화식 도움말 시스템이 시작됩니다. 인수가 문자열인 경우 문자열은 모듈, 함수, 클래스, 메서드, 키워드 또는 설명서 항목의 이름으로 조회되고 도움말 페이지가 콘솔에 인쇄됩니다. 인수가 다른 종류의 개체인 경우 개체에 대한 도움말 페이지가 생성됩니다.

help()를 호출할 때 함수의 매개변수 목록에 슬래시(/)가 나타나면 슬래시 앞의 매개변수가 위치 전용임을 의미합니다. 자세한 내용은 위치 전용 매개변수에 대한 FAQ 항목을 참조하세요.

이 함수는 사이트 모듈에 의해 내장 네임스페이스에 추가됩니다.

버전 3.4에서 변경: pydoc 및 inspect에 대한 변경은 콜러블에 대해 보고된 서명이 이제 더 포괄적이고 일관성이 있음을 의미합니다.

hex(x)

정수를 “0x” 접두사가 붙은 소문자 16진수 문자열로 변환합니다. x가 Python int 객체가 아니면 정수를 반환하는 __index__() 메서드를 정의해야 합니다. 몇 가지 예:

>>> hex(255)
'0xff'
>>> hex(-42)
'-0x2a'

정수를 접두사가 있거나 없는 대문자 또는 소문자 16진수 문자열로 변환하려면 다음 방법 중 하나를 사용할 수 있습니다.

>>> '%#x' % 255, '%x' % 255, '%X' % 255
('0xff', 'ff', 'FF')
>>> format(255, '#x'), format(255, 'x'), format(255, 'X')
('0xff', 'ff', 'FF')
>>> f'{255:#x}', f'{255:x}', f'{255:X}'
('0xff', 'ff', 'FF')

자세한 내용은 format()을 참조하십시오.

16진법을 사용하여 16진수 문자열을 정수로 변환하려면 int()도 참조하십시오.

참고: float에 대한 16진수 문자열 표현을 얻으려면 float.hex() 메서드를 사용하십시오.

id(object)

객체의 “ID”를 반환합니다. 이것은 수명 동안 이 개체에 대해 고유하고 일정하도록 보장되는 정수입니다. 수명이 겹치지 않는 두 개체는 동일한 id() 값을 가질 수 있습니다.

CPython 구현 세부 정보: 메모리에 있는 개체의 주소입니다.

인수 id로 감사 이벤트 builtins.id를 발생시킵니다.

input()
input(prompt)

프롬프트 인수가 있으면 후행 개행 없이 표준 출력에 기록됩니다. 그런 다음 함수는 입력에서 한 줄을 읽고 문자열로 변환하고(후행 줄 바꿈 제거) 반환합니다. EOF를 읽으면 EOFError가 발생합니다. 예:

>>> s = input('--> ')  
 --> Monty Python's Flying Circus
>>>  s  
 "Monty Python's Flying Circus"

readline 모듈이 로드된 경우 input()은 이를 사용하여 정교한 줄 편집 및 히스토리 기능을 제공합니다.

입력을 읽기 전에 인수 프롬프트로 감사 이벤트 builtins.input을 발생시킵니다.

입력을 성공적으로 읽은 후 결과로 감사 이벤트 builtins.input/result를 발생시킵니다.

class int(x=0)
class int(x, base=10)

숫자 또는 문자열 x로 구성된 정수 객체를 반환하거나 인수가 제공되지 않으면 0을 반환합니다. x가 __int__()를 정의하면 int(x)는 x.__int__()를 반환합니다. x가 __index__()를 정의하면 x.__index__()를 반환합니다. x가 __trunc__()를 정의하면 x.__trunc__()를 반환합니다. 부동 소수점 숫자의 경우 0을 향해 잘립니다.

x가 숫자가 아니거나 base가 주어지면 x는 기수 base의 정수를 나타내는 문자열, 바이트 또는 바이트 배열 인스턴스여야 합니다. 선택적으로 문자열 앞에 + 또는 -(사이에 공백 없음)가 올 수 있고, 선행 0이 있고, 공백으로 둘러싸이고, 숫자 사이에 단일 밑줄이 산재되어 있습니다.

밑이 n인 정수 문자열에는 각각 0에서 n-1까지의 값을 나타내는 숫자가 포함됩니다. 값 0–9는 유니코드 십진수로 나타낼 수 있습니다. 값 10-35는 a에서 z까지(또는 A에서 Z까지)로 나타낼 수 있습니다. 기본 기준은 10입니다. 허용되는 기준은 0과 2–36입니다. Base-2, -8 및 -16 문자열은 코드의 정수 리터럴과 마찬가지로 선택적으로 0b/0B, 0o/0O 또는 0x/0X로 접두사를 붙일 수 있습니다. 밑이 0인 경우 문자열은 코드의 정수 리터럴과 유사한 방식으로 해석됩니다. 실제 밑은 접두사에 의해 결정되는 2, 8, 10 또는 16입니다. 기본 0은 선행 0도 허용하지 않습니다. int(‘010’, 0)은 올바르지 않은 반면 int(‘010’) 및 int(‘010’, 8)은 올바르습니다.

정수 유형은 숫자 유형 — int, float, complex에 설명되어 있습니다.

버전 3.4에서 변경: base가 int의 인스턴스가 아니고 기본 객체에 base.__index__ 메서드가 있는 경우, 해당 메서드는 기본에 대한 정수를 얻기 위해 호출됩니다. 이전 버전에서는 base.__index__ 대신 base.__int__를 사용했습니다.

버전 3.6에서 변경: 코드 리터럴에서와 같이 밑줄로 숫자를 그룹화하는 것이 허용됩니다.

버전 3.7에서 변경: x는 이제 위치 전용 매개변수입니다.

버전 3.8에서 변경: __int__()가 정의되지 않은 경우 __index__()로 돌아갑니다.

버전 3.11에서 변경: __trunc__()에 대한 위임은 더 이상 사용되지 않습니다.

버전 3.11에서 변경: 서비스 거부 공격을 방지하기 위해 int 문자열 입력 및 문자열 표현을 제한할 수 있습니다. 문자열 x를 int로 변환하는 동안 제한을 초과하거나 int를 문자열로 변환하는 것이 제한을 초과하면 ValueError가 발생합니다. integer string conversion length limitation문서를 참조하십시오.

isinstance(objectclassinfo)

객체 인수가 classinfo 인수의 인스턴스이거나 그 (직접, 간접 또는 가상) 하위 클래스의 인스턴스이면 True를 반환합니다. object가 주어진 유형의 객체가 아닌 경우 함수는 항상 False를 반환합니다. classinfo가 유형 객체의 튜플(또는 재귀적으로 다른 튜플)이거나 여러 유형의 공용체 유형인 경우 객체가 유형의 인스턴스이면 True를 반환합니다. classinfo가 유형이나 유형의 튜플 및 그러한 튜플이 아닌 경우 TypeError 예외가 발생합니다. 이전 검사가 성공하면 잘못된 유형에 대해 TypeError가 발생하지 않을 수 있습니다.

버전 3.10에서 변경: classinfo는 Union Type이 될 수 있습니다.

issubclass(classclassinfo)

클래스가 classinfo의 하위 클래스(직접, 간접 또는 가상)이면 True를 반환합니다. 클래스는 자신의 하위 클래스로 간주됩니다. classinfo는 클래스 객체의 튜플(또는 재귀적으로 다른 튜플)이거나 Union Type일 수 있으며, 이 경우 class가 classinfo에 있는 항목의 하위 클래스이면 True를 반환합니다. 다른 경우에는 TypeError 예외가 발생합니다.

버전 3.10에서 변경: classinfo는 Union Type이 될 수 있습니다.

iter(object)
iter(object, sentinel)

반복자 객체를 반환합니다. 첫 번째 인수는 두 번째 인수의 존재 여부에 따라 매우 다르게 해석됩니다. 두 번째 인수가 없으면 object는 반복 가능한 프로토콜( __iter__() 메서드)을 지원하는 컬렉션 객체이거나 시퀀스 프로토콜(0에서 시작하는 정수 인수를 사용하는 __getitem__() 메서드)을 지원해야 합니다. 이러한 프로토콜 중 하나를 지원하지 않으면 TypeError가 발생합니다. 두 번째 인수 sentinel이 제공되면 object는 콜러블 객체여야 합니다. 이 경우에 생성된 이터레이터는 __next__() 메서드에 대한 각 호출에 대해 인수 없이 객체를 호출합니다; 반환된 값이 sentinel과 같으면 StopIteration이 발생하고 그렇지 않으면 값이 반환됩니다.

Iterator Types도 참조하십시오.

iter()의 두 번째 형식의 유용한 응용 프로그램 중 하나는 블록 판독기를 빌드하는 것입니다. 예를 들어 파일 끝에 도달할 때까지 이진 데이터베이스 파일에서 고정 너비 블록을 읽는 경우:

from functools import partial
with open('mydata.db', 'rb') as f:
    for block in iter(partial(f.read, 64), b''):
        process_block(block)

len(s)

객체의 길이(항목 수)를 반환합니다. 인수는 시퀀스(예: 문자열, 바이트, 튜플, 목록 또는 범위) 또는 컬렉션(예: 사전, 집합 또는 고정 집합)일 수 있습니다.

CPython 구현 세부 사항: len은 범위(2 ** 100)와 같이 sys.maxsize보다 긴 길이에서 OverflowError를 발생시킵니다.

class list
class list(iterable)

목록은 함수가 아니라 목록 및 시퀀스 유형 — 목록, 튜플, 범위에 설명된 대로 실제로 변경 가능한 시퀀스 유형입니다.

locals()

현재 로컬 심볼 테이블을 나타내는 사전을 업데이트하고 반환합니다. 자유 변수는 함수 블록에서 호출될 때 locals()에 의해 반환되지만 클래스 블록에서는 반환되지 않습니다. 모듈 수준에서 locals() 및 globals()는 동일한 사전입니다.

참고: 이 사전의 내용은 수정하면 안 됩니다. 변경 사항은 인터프리터가 사용하는 지역 및 자유 변수의 값에 영향을 미치지 않을 수 있습니다.

map(functioniterable*iterables)

iterable의 모든 항목에 함수를 적용하여 결과를 산출하는 반복자를 반환합니다. 추가 iterables 인수가 전달되면 function은 많은 인수를 가져와야 하며 모든 iterables의 항목에 병렬로 적용됩니다. 반복 가능한 항목이 여러 개인 경우 가장 짧은 반복 가능한 항목이 소진되면 반복자가 중지됩니다. 함수 입력이 이미 인수 튜플로 배열된 경우 itertools.starmap()을 참조하세요.

max(iterable, *, key=None)
max(iterable, *, default, key=None)
max(arg1, arg2, *args, key=None)

iterable에서 가장 큰 항목 또는 두 개 이상의 인수 중 가장 큰 항목을 반환합니다.

하나의 위치 인수가 제공되면 iterable이어야 합니다. iterable에서 가장 큰 항목이 반환됩니다. 두 개 이상의 위치 인수가 제공되면 위치 인수 중 가장 큰 것이 반환됩니다.

두 가지 선택적인 키워드 전용 인수가 있습니다. key 인수는 list.sort()에 사용되는 것과 같은 단일 인수 순서 지정 함수를 지정합니다. 기본 인수는 제공된 iterable이 비어 있는 경우 반환할 객체를 지정합니다. iterable이 비어 있고 기본값이 제공되지 않으면 ValueError가 발생합니다.

여러 항목이 최대인 경우 함수는 처음 발견된 항목을 반환합니다. 이는 sorted(iterable, key=keyfunc, reverse=True)[0] 및 heapq.nlargest(1, iterable, key=keyfunc)와 같은 다른 정렬 안정성 보존 도구와 일치합니다.

버전 3.4의 새로운 기능: 기본 키워드 전용 인수입니다.

버전 3.8에서 변경: 키는 None이 될 수 있습니다.

class memoryview(object)

주어진 인자로 생성된 “메모리 뷰” 객체를 반환합니다. 자세한 내용은 메모리 보기를 참조하세요.

min(iterable, *, key=None)
min(iterable, *, default, key=None)
min(arg1, arg2, *args, key=None)

iterable에서 가장 작은 항목 또는 두 개 이상의 인수 중 가장 작은 항목을 반환합니다.

하나의 위치 인수가 제공되면 iterable이어야 합니다. iterable에서 가장 작은 항목이 반환됩니다. 두 개 이상의 위치 인수가 제공된 경우 가장 작은 위치 인수가 반환됩니다.

두 가지 선택적인 키워드 전용 인수가 있습니다. key 인수는 list.sort()에 사용되는 것과 같은 단일 인수 순서 지정 함수를 지정합니다. 기본 인수는 제공된 iterable이 비어 있는 경우 반환할 객체를 지정합니다. iterable이 비어 있고 기본값이 제공되지 않으면 ValueError가 발생합니다.

여러 항목이 최소인 경우 함수는 처음 발견된 항목을 반환합니다. 이는 sorted(iterable, key=keyfunc)[0] 및 heapq.nsmallest(1, iterable, key=keyfunc)와 같은 다른 정렬 안정성 보존 도구와 일치합니다.

버전 3.4의 새로운 기능: 기본 키워드 전용 인수입니다.

버전 3.8에서 변경: 키는 None이 될 수 있습니다.

next(iterator)
next(iterator, default)

__next__() 메서드를 호출하여 반복자에서 다음 항목을 검색합니다. 기본값이 주어지면 반복자가 소진되면 반환되고, 그렇지 않으면 StopIteration이 발생합니다.

class object

특징이 없는 새로운 객체를 반환합니다. object는 모든 클래스의 기반입니다. 여기에는 Python 클래스의 모든 인스턴스에 공통적인 메서드가 있습니다. 이 함수는 인수를 허용하지 않습니다.

참고: 개체에는 __dict__가 없으므로 개체 클래스의 인스턴스에 임의의 특성을 할당할 수 없습니다.

oct(x)

정수를 접두사 “0o”가 붙은 8진수 문자열로 변환합니다. 결과는 유효한 Python 표현식입니다. x가 Python int 객체가 아니면 정수를 반환하는 __index__() 메서드를 정의해야 합니다. 예를 들어:

>>> oct(8)
'0o10'
>>> oct(-56)
'-0o70'

정수를 접두사 “0o”를 사용하거나 사용하지 않고 8진수 문자열로 변환하려면 다음 방법 중 하나를 사용할 수 있습니다.

>>> '%#o' % 10, '%o' % 10
('0o12', '12')
>>> format(10, '#o'), format(10, 'o')
('0o12', '12')
>>> f'{10:#o}', f'{10:o}'
('0o12', '12')

자세한 내용은 format()도 참조하십시오.

open(filemode=’r’buffering=- 1encoding=Noneerrors=Nonenewline=Noneclosefd=Trueopener=None)

파일을 열고 해당 파일 객체를 반환합니다. 파일을 열 수 없으면 OSError가 발생합니다. 이 기능을 사용하는 방법에 대한 더 많은 예제는 파일 읽기 및 쓰기를 참조하십시오.

file은 열 파일의 경로 이름(절대 또는 현재 작업 디렉터리에 대한 상대) 또는 래핑할 파일의 정수 파일 설명자를 제공하는 경로류 객체입니다. (파일 디스크립터가 주어지면 closefd가 False로 설정되지 않는 한 반환된 I/O 객체가 닫힐 때 파일 디스크립터가 닫힙니다.)

mode는 파일이 열리는 모드를 지정하는 선택적 문자열입니다. 기본적으로 ‘r’은 텍스트 모드에서 읽기 위해 열기를 의미합니다. 다른 일반적인 값은 쓰기(파일이 이미 있는 경우 파일 자르기)를 위한 ‘w’, 단독 생성을 위한 ‘x’, 추가를 위한 ‘a'(일부 Unix 시스템에서는 모든 쓰기가 파일 끝에 추가됨을 의미함)입니다. 현재 검색 위치에 관계없이). 텍스트 모드에서 인코딩이 지정되지 않은 경우 사용되는 인코딩은 플랫폼에 따라 다릅니다. 현재 로케일 인코딩을 가져오기 위해 locale.getencoding()이 호출됩니다. (원시 바이트를 읽고 쓰기 위해 이진 모드를 사용하고 인코딩을 지정하지 않은 상태로 둡니다.) 사용 가능한 모드는 다음과 같습니다.

CharacterMeaning
'r'읽기용으로 열기(기본값)
'w'쓰기 위해 열기, 먼저 파일 자르기
'x'독점 생성을 위해 열기, 파일이 이미 존재하는 경우 실패
'a'쓰기용으로 열기, 파일이 있으면 파일 끝에 추가
'b'바이너리 모드
't'텍스트 모드(기본값)
'+'업데이트를 위해 열려 있음(읽기 및 쓰기)

기본 모드는 ‘r’입니다(텍스트 읽기용으로 열림, ‘rt’의 동의어). 모드 ‘w+’ 및 ‘w+b’는 파일을 열고 자릅니다. 모드 ‘r+’ 및 ‘r+b’는 잘림 없이 파일을 엽니다.

개요에서 언급했듯이 Python은 이진 I/O와 텍스트 I/O를 구분합니다. 바이너리 모드에서 열린 파일(mode 인수에 ‘b’ 포함)은 디코딩 없이 콘텐츠를 바이트열 객체로 반환합니다. 텍스트 모드(기본값 또는 mode 인수에 ‘t’가 포함된 경우)에서 파일의 내용은 str로 반환되며 바이트는 플랫폼 종속 인코딩을 사용하거나 주어진 경우 지정된 인코딩을 사용하여 먼저 디코딩되었습니다.

참고: Python은 기본 운영 체제의 텍스트 파일 개념에 의존하지 않습니다. 모든 처리는 Python 자체에서 수행되므로 플랫폼 독립적입니다.

buffering은 버퍼링 정책을 설정하는 데 사용되는 선택적 정수입니다. 버퍼링을 끄려면 0을 전달하고(바이너리 모드에서만 허용됨) 라인 버퍼링을 선택하려면 1을 전달하고(텍스트 모드에서만 사용 가능) 정수 > 1을 전달하여 고정 크기 청크 버퍼의 크기를 바이트 단위로 나타냅니다. 이 방법으로 버퍼 크기를 지정하는 것은 바이너리 버퍼 I/O에 적용되지만 TextIOWrapper(즉, mode=’r+’로 열린 파일)에는 또 다른 버퍼링이 있습니다. TextIOWrapper에서 버퍼링을 비활성화하려면 io.TextIOWrapper.reconfigure()에 대한 write_through 플래그 사용을 고려하십시오. 버퍼링 인수가 지정되지 않은 경우 기본 버퍼링 정책은 다음과 같이 작동합니다.

  • 바이너리 파일은 고정 크기 청크로 버퍼링됩니다. 버퍼의 크기는 기본 장치의 “블록 크기”를 결정하고 io.DEFAULT_BUFFER_SIZE로 폴백하는 휴리스틱을 사용하여 선택됩니다. 많은 시스템에서 버퍼는 일반적으로 4096 또는 8192바이트 길이입니다.
  • “대화형” 텍스트 파일(isatty()가 True를 반환하는 파일)은 라인 버퍼링을 사용합니다. 다른 텍스트 파일은 이진 파일에 대해 위에서 설명한 정책을 사용합니다.

encoding은 파일을 디코딩하거나 인코딩하는 데 사용되는 인코딩의 이름입니다. 텍스트 모드에서만 사용해야 합니다. 기본 인코딩은 플랫폼에 따라 다르지만(locale.getencoding()이 반환하는 모든 항목) Python에서 지원하는 모든 텍스트 인코딩을 사용할 수 있습니다. 지원되는 인코딩 목록은 코덱 모듈을 참조하십시오.

errors는 인코딩 및 디코딩 오류를 처리하는 방법을 지정하는 선택적 문자열입니다. 바이너리 모드에서는 사용할 수 없습니다. codecs.register_error()로 등록된 모든 오류 처리 이름도 유효하지만 다양한 표준 오류 처리기를 사용할 수 있습니다(오류 처리기 아래에 나열됨). 표준 이름에는 다음이 포함됩니다.

  • 인코딩 오류가 있는 경우 ValueError 예외를 발생시키려면 ‘strict’입니다. 기본값 없음은 동일한 효과를 가집니다.
  • ‘무시’는 오류를 무시합니다. 인코딩 오류를 무시하면 데이터가 손실될 수 있습니다.
  • ‘replace’는 형식이 잘못된 데이터가 있는 위치에 대체 마커(예: ‘?’)가 삽입되도록 합니다.
  • ‘surrogateescape’는 잘못된 바이트를 U+DC80에서 U+DCFF까지의 하위 대리 코드 단위로 나타냅니다. 그런 다음 데이터를 쓸 때 surrogateescape 오류 처리기가 사용될 때 이러한 대리 코드 단위는 동일한 바이트로 다시 전환됩니다. 이는 알 수 없는 인코딩으로 파일을 처리하는 데 유용합니다.
  • ‘xmlcharrefreplace’는 파일에 쓸 때만 지원됩니다. 인코딩에서 지원하지 않는 문자는 적절한 XML 문자 참조 &#nnn;으로 대체됩니다.
  • ‘backslashreplace’는 형식이 잘못된 데이터를 Python의 백슬래시 이스케이프 시퀀스로 바꿉니다.
  • ‘namereplace'(작성할 때만 지원됨)는 지원되지 않는 문자를 \N{…} 이스케이프 시퀀스로 바꿉니다.

newline은 스트림에서 줄 바꿈 문자를 구문 분석하는 방법을 결정합니다. 없음, ”, ‘\n’, ‘\r’ 및 ‘\r\n’일 수 있습니다. 다음과 같이 작동합니다.

  • 스트림에서 입력을 읽을 때 newline이 None이면 범용 newlines 모드가 활성화됩니다. 입력의 라인은 ‘\n’, ‘\r’ 또는 ‘\r\n’으로 끝날 수 있으며 호출자에게 반환되기 전에 ‘\n’으로 변환됩니다. ”이면 범용 개행 모드가 활성화되지만 줄 끝이 번역되지 않은 상태로 호출자에게 반환됩니다. 다른 유효한 값이 있는 경우 입력 줄은 지정된 문자열에 의해서만 종료되며 줄 끝은 번역되지 않은 상태로 호출자에게 반환됩니다.
  • 스트림에 출력을 쓸 때 newline이 None이면 작성된 모든 ‘\n’ 문자는 시스템 기본 줄 구분 기호인 os.linesep로 변환됩니다. newline이 ” 또는 ‘\n’이면 변환이 수행되지 않습니다. 줄 바꿈이 다른 유효한 값 중 하나인 경우 작성된 모든 ‘\n’ 문자는 지정된 문자열로 변환됩니다.

closefd가 False이고 파일 이름이 아닌 파일 설명자가 제공된 경우 파일이 닫힐 때 기본 파일 설명자가 열린 상태로 유지됩니다. 파일 이름이 주어지면 closefd는 True여야 합니다(기본값). 그렇지 않으면 오류가 발생합니다.

콜러블을 오프너로 전달하여 사용자 지정 오프너를 사용할 수 있습니다. 그런 다음 (file, flags)를 사용하여 opener를 호출하여 파일 개체에 대한 기본 파일 설명자를 얻습니다. opener는 열린 파일 디스크립터를 반환해야 합니다(os.open을 opener로 전달하면 None을 전달하는 것과 유사한 기능이 생성됨).

새로 만든 파일은 상속할 수 없습니다.

다음 예제에서는 os.open() 함수의 dir_fd 매개변수를 사용하여 지정된 디렉토리에 상대적인 파일을 엽니다.

>>> import os
>>> dir_fd = os.open('somedir', os.O_RDONLY)
>>> def opener(path, flags):
...     return os.open(path, flags, dir_fd=dir_fd)
...
>>> with open('spamspam.txt', 'w', opener=opener) as f:
...     print('This will be written to somedir/spamspam.txt', file=f)
... 
>>> os.close(dir_fd)  # don't leak a file descriptor

open() 함수가 반환하는 파일 객체의 유형은 모드에 따라 다릅니다. open()이 텍스트 모드(‘w’, ‘r’, ‘wt’, ‘rt’ 등)에서 파일을 여는 데 사용되면 io.TextIOBase(특히 io.TextIOWrapper)의 하위 클래스를 반환합니다. 버퍼링이 있는 바이너리 모드에서 파일을 여는 데 사용되는 경우 반환되는 클래스는 io.BufferedIOBase의 하위 클래스입니다. 정확한 클래스는 다양합니다. 읽기 바이너리 모드에서는 io.BufferedReader를 반환합니다. 쓰기 바이너리 및 추가 바이너리 모드에서는 io.BufferedWriter를 반환하고 읽기/쓰기 모드에서는 io.BufferedRandom을 반환합니다. 버퍼링이 비활성화되면 io.RawIOBase, io.FileIO의 하위 클래스인 원시 스트림이 반환됩니다.

fileinput, io(open()이 선언된 경우), os, os.path, tempfile 및 shutil과 같은 파일 처리 모듈도 참조하십시오.

파일, 모드, 플래그 인수를 사용하여 열린 감사 이벤트를 발생시킵니다.

mode 및 flags 인수는 수정되었거나 원래 호출에서 유추되었을 수 있습니다.

버전 3.3에서 변경:

  • 오프너 매개변수가 추가되었습니다.
  • ‘x’ 모드가 추가되었습니다.
  • IOError가 발생했지만 이제는 OSError의 별칭입니다.
  • 독점 생성 모드(‘x’)에서 열린 파일이 이미 존재하는 경우 FileExistsError가 발생합니다.

버전 3.4에서 변경:

  • 이제 파일을 상속할 수 없습니다.

버전 3.5에서 변경:

  • 시스템 호출이 중단되고 신호 처리기가 예외를 발생시키지 않으면 함수는 이제 InterruptedError 예외를 발생시키는 대신 시스템 호출을 재시도합니다(이유는 PEP 475 참조).
  • ‘namereplace’ 오류 처리기가 추가되었습니다.

버전 3.6에서 변경:

  • os.PathLike를 구현하는 개체를 허용하도록 지원이 추가되었습니다.
  • Windows에서 콘솔 버퍼를 열면 io.FileIO가 아닌 io.RawIOBase의 하위 클래스가 반환될 수 있습니다.

버전 3.11에서 변경: ‘U’ 모드가 제거되었습니다.

ord(c)

하나의 유니코드 문자를 나타내는 문자열이 주어지면 해당 문자의 유니코드 코드 포인트를 나타내는 정수를 반환합니다. 예를 들어, ord(‘a’)는 정수 97을 반환하고 ord(‘€’)(유로 기호)는 8364를 반환합니다. 이것은 chr()의 반대입니다.

pow(baseexpmod=None)

기지를 전력 특급으로 되돌립니다. mod가 있으면 base를 power exp, modulo mod로 반환합니다(pow(base, exp) % mod보다 더 효율적으로 계산됨). 인수가 두 개인 형식 pow(base, exp)는 거듭제곱 연산자 base**exp를 사용하는 것과 같습니다.

인수에는 숫자 유형이 있어야 합니다. 혼합 피연산자 유형을 사용하면 이진 산술 연산자에 대한 강제 규칙이 적용됩니다. int 피연산자의 경우 결과는 두 번째 인수가 음수가 아닌 한 (강제 변환 후) 피연산자와 동일한 유형을 가집니다. 이 경우 모든 인수가 float로 변환되고 float 결과가 전달됩니다. 예를 들어 pow(10, 2)는 100을 반환하지만 pow(10, -2)는 0.01을 반환합니다. int 또는 float 유형의 음수 밑과 정수가 아닌 지수의 경우 복잡한 결과가 전달됩니다. 예를 들어 pow(-9, 0.5)는 3j에 가까운 값을 반환합니다.

int 피연산자 base 및 exp의 경우 mod가 있으면 mod도 정수 유형이어야 하고 mod는 0이 아니어야 합니다. mod가 있고 exp가 음수이면 base는 mod에 상대적으로 소수여야 합니다. 이 경우 pow(inv_base, -exp, mod)가 반환되며 여기서 inv_base는 base modulo mod의 반대입니다.

다음은 38 모듈로 97의 역수를 계산하는 예입니다.

>>> pow(38, -1, mod=97)
23
>>> 23 * 38 % 97 == 1
True

버전 3.8에서 변경: int 피연산자의 경우, pow의 3개 인수 형식은 이제 두 번째 인수가 음수가 되도록 허용하여 모듈러 역의 계산을 허용합니다.

버전 3.8에서 변경: 키워드 인수를 허용합니다. 이전에는 위치 인수만 지원되었습니다.

print(*objectssep=’ ‘end=’\n’file=Noneflush=False)

객체를 sep로 구분하고 end로 구분하여 텍스트 스트림 파일에 인쇄합니다. sep, end, file 및 flush(존재하는 경우)는 키워드 인수로 제공되어야 합니다.

키워드가 아닌 모든 인수는 str()과 같은 문자열로 변환되고 스트림에 기록되며 sep로 구분되고 뒤에 end가 옵니다. sep와 end는 모두 문자열이어야 합니다. 기본값을 사용한다는 의미인 None일 수도 있습니다. 객체가 주어지지 않으면 print()는 end를 씁니다.

file 인수는 write(string) 메서드가 있는 객체여야 합니다. 존재하지 않거나 None이면 sys.stdout이 사용됩니다. 인쇄된 인수는 텍스트 문자열로 변환되기 때문에 print()는 바이너리 모드 파일 객체와 함께 사용할 수 없습니다. 이를 위해 file.write(…)를 대신 사용하십시오.

출력이 버퍼링되는지 여부는 일반적으로 파일에 의해 결정되지만 flush 키워드 인수가 true이면 스트림이 강제로 플러시됩니다.

버전 3.3에서 변경: flush 키워드 인수를 추가했습니다.

class property(fget=Nonefset=Nonefdel=Nonedoc=None)

속성 속성을 반환합니다.

fget은 속성 값을 가져오는 함수입니다. fset은 속성 값을 설정하는 기능입니다. fdel은 속성 값을 삭제하는 함수입니다. 그리고 doc는 속성에 대한 docstring을 생성합니다.

일반적인 용도는 관리 속성 x를 정의하는 것입니다.

class C:
    def __init__(self):
        self._x = None

    def getx(self):
        return self._x

    def setx(self, value):
        self._x = value

    def delx(self):
        del self._x

    x = property(getx, setx, delx, "I'm the 'x' property.")

c가 C의 인스턴스이면 c.x는 getter를 호출하고 c.x = value는 setter를 호출하고 del c.x는 deleter를 호출합니다.

주어진 경우, doc는 속성 속성의 docstring이 됩니다. 그렇지 않으면 속성이 fget의 docstring(존재하는 경우)을 복사합니다. 따라서 property()를 데코레이터로 사용하여 읽기 전용 속성을 쉽게 만들 수 있습니다.

class Parrot:
    def __init__(self):
        self._voltage = 100000

    @property
    def voltage(self):
        """Get the current voltage."""
        return self._voltage

@property 데코레이터는 voltage() 메서드를 같은 이름의 읽기 전용 속성에 대한 “getter”로 바꾸고 전압에 대한 독스트링을 “Get the current voltage”로 설정합니다.

속성 개체에는 장식된 함수로 설정된 해당 액세서 함수를 사용하여 속성의 복사본을 만드는 데코레이터로 사용할 수 있는 getter, setter 및 deleter 메서드가 있습니다. 예를 들면 다음과 같이 가장 잘 설명됩니다.

class C:
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    @x.deleter
    def x(self):
        del self._x

이 코드는 첫 번째 예제와 정확히 동일합니다. 추가 기능에 원래 속성과 동일한 이름을 지정해야 합니다(이 경우 x).

반환된 속성 개체에는 생성자 인수에 해당하는 속성 fget, fset 및 fdel도 있습니다.

버전 3.5에서 변경: 속성 객체의 독스트링은 이제 쓰기 가능합니다.

class range(stop)
class range(start, stop, step=1)

범위는 함수라기보다 범위 및 시퀀스 유형 — 목록, 튜플, 범위에 설명된 대로 실제로는 변경할 수 없는 시퀀스 유형입니다.

repr(object)

객체의 인쇄 가능한 표현을 포함하는 문자열을 반환합니다. 많은 유형의 경우 이 함수는 eval()에 전달될 때 동일한 값을 가진 객체를 생성하는 문자열을 반환하려고 시도합니다. 그렇지 않은 경우 표현은 종종 개체의 이름과 주소를 포함하는 추가 정보와 함께 개체 유형의 이름을 포함하는 꺾쇠 괄호로 묶인 문자열입니다. 클래스는 __repr__() 메서드를 정의하여 이 함수가 인스턴스에 대해 반환하는 것을 제어할 수 있습니다. sys.displayhook()에 액세스할 수 없는 경우 이 함수는 RuntimeError를 발생시킵니다.

reversed(seq)

역 반복자를 반환합니다. seq는 __reversed__() 메서드가 있거나 시퀀스 프로토콜(0에서 시작하는 정수 인수를 사용하는 __len__() 메서드 및 __getitem__() 메서드)을 지원하는 객체여야 합니다.

round(numberndigits=None)

소수점 이하 ndigits 정밀도로 반올림된 숫자를 반환합니다. ndigits가 생략되거나 None이면 입력에 가장 가까운 정수를 반환합니다.

round()를 지원하는 기본 제공 유형의 경우 값은 10의 제곱에서 n자리를 뺀 가장 가까운 배수로 반올림됩니다. 두 배수가 똑같이 가까우면 짝수 선택 쪽으로 반올림됩니다(예를 들어 round(0.5)와 round(-0.5)는 모두 0이고 round(1.5)는 2입니다). 모든 정수 값은 ndigits(양수, 0 또는 음수)에 대해 유효합니다. 반환 값은 ndigits가 생략되거나 None인 경우 정수입니다. 그렇지 않으면 반환 값은 숫자와 동일한 유형입니다.

일반 Python 객체 번호의 경우 대리자를 number.__round__로 반올림합니다.

참고: float에 대한 round()의 동작은 놀랄 수 있습니다. 예를 들어 round(2.675, 2)는 예상되는 2.68 대신 2.67을 제공합니다. 이것은 버그가 아닙니다. 대부분의 소수점 이하 자릿수를 실수로 정확히 표현할 수 없기 때문입니다. 자세한 내용은 부동 소수점 산술: 문제 및 제한 사항을 참조하십시오.

class set
class set(iterable)

선택적으로 iterable에서 가져온 요소와 함께 새로운 집합 객체를 반환합니다. set은 내장 클래스입니다. 이 클래스에 대한 문서는 set 및 Set Types — set, frozenset을 참조하십시오.

다른 컨테이너의 경우 내장 frozenset, list, tuple 및 dict 클래스와 collections 모듈을 참조하세요.

setattr(objectnamevalue)

이것은 getattr()의 대응물입니다. 인수는 객체, 문자열 및 임의의 값입니다. 문자열은 기존 속성 또는 새 속성의 이름을 지정할 수 있습니다. 객체가 허용하는 경우 함수는 속성에 값을 할당합니다. 예를 들어 setattr(x, ‘foobar’, 123)은 x.foobar = 123과 동일합니다.

예를 들어 사용자 지정 __getattribute__()에서 또는 __slots__를 통해 객체가 이를 적용하도록 선택하지 않는 한 이름은 식별자 및 키워드에 정의된 Python 식별자일 필요가 없습니다. 이름이 식별자가 아닌 속성은 점 표기법을 사용하여 액세스할 수 없지만 getattr() 등을 통해 액세스할 수 있습니다.

참고 개인 이름 맹글링은 컴파일 시간에 발생하므로 setattr()로 설정하려면 개인 속성(앞에 두 개의 밑줄이 있는 속성) 이름을 수동으로 맹글링해야 합니다.

class slice(stop)
class slice(start, stop, step=1)

범위(시작, 중지, 단계)로 지정된 인덱스 집합을 나타내는 슬라이스 객체를 반환합니다. 시작 및 단계 인수의 기본값은 없음입니다. 슬라이스 개체에는 인수 값(또는 해당 기본값)만 반환하는 읽기 전용 데이터 속성인 start, stop 및 step이 있습니다. 다른 명시적인 기능은 없습니다. 그러나 NumPy 및 기타 타사 패키지에서 사용됩니다. 슬라이스 객체는 확장 인덱싱 구문을 사용할 때도 생성됩니다. 예: a[시작:중지:단계] 또는 a[시작:중지, i]. 반복자를 반환하는 대체 버전은 itertools.islice()를 참조하세요.

sorted(iterable/*key=Nonereverse=False)

iterable의 항목에서 새로 정렬된 목록을 반환합니다.

키워드 인수로 지정해야 하는 두 개의 선택적 인수가 있습니다.

key는 iterable의 각 요소에서 비교 키를 추출하는 데 사용되는 하나의 인수 함수를 지정합니다(예: key=str.lower). 기본값은 없음입니다(요소를 직접 비교).

반전은 부울 값입니다. True로 설정하면 각 비교가 반대인 것처럼 목록 요소가 정렬됩니다.

functools.cmp_to_key()를 사용하여 구식 cmp 함수를 키 함수로 변환합니다.

내장된 sorted() 함수는 안정적임을 보장합니다. 동등하다고 비교되는 요소의 상대적인 순서를 변경하지 않는 경우 정렬이 안정적입니다. 이는 여러 단계에서 정렬하는 데 유용합니다(예: 부서별로 정렬한 다음 급여 등급별로 정렬).

정렬 알고리즘은 항목 간의 < 비교만 사용합니다. __lt__() 메서드를 정의하면 정렬에 충분하지만 PEP 8은 6가지 rich comparisons를 모두 구현할 것을 권장합니다. 이렇게 하면 다른 기본 메서드에 의존하는 max()와 같은 다른 주문 도구와 동일한 데이터를 사용할 때 버그를 방지하는 데 도움이 됩니다. 여섯 가지 비교를 모두 구현하면 반영된 __gt__() 메서드를 호출할 수 있는 혼합 유형 비교에 대한 혼동을 피하는 데도 도움이 됩니다.

정렬 예제와 간단한 정렬 튜토리얼은 Sorting HOW TO를 참조하십시오.

@staticmethod

메서드를 정적 메서드로 변환합니다.

정적 메서드는 암시적 첫 번째 인수를 받지 않습니다. 정적 메소드를 선언하려면 이 관용구를 사용하십시오“`

class C:
    @staticmethod
    def f(arg1, arg2, ...): ...

@staticmethod 형식은 함수 데코레이터입니다. 자세한 내용은 함수 정의를 참조하세요.

정적 메서드는 클래스(예: C.f()) 또는 인스턴스(예: C().f())에서 호출할 수 있습니다. 또한 일반 함수(예: f())로 호출할 수 있습니다.

Python의 정적 메서드는 Java 또는 C++의 메서드와 유사합니다. 또한 대체 클래스 생성자를 만드는 데 유용한 변형에 대해서는 classmethod()를 참조하십시오.

모든 데코레이터와 마찬가지로 staticmethod를 일반 함수로 호출하고 그 결과로 무언가를 수행하는 것도 가능합니다. 이는 클래스 본문에서 함수에 대한 참조가 필요하고 인스턴스 메서드로의 자동 변환을 피하려는 경우에 필요합니다. 이러한 경우 다음 관용구를 사용하십시오.

def regular_function():
    ...

class C:
    method = staticmethod(regular_function)

정적 메서드에 대한 자세한 내용은 표준 형식 계층을 참조하세요.

버전 3.10에서 변경: 정적 메서드는 이제 메서드 속성(__module__, __name__, __qualname__, __doc__ 및 __annotations__)을 상속하고 새로운 __wrapped__ 속성을 가지며 이제 일반 함수로 호출할 수 있습니다.

class str(object=”)
class str(object=b”, encoding=’utf-8′, errors=’strict’)

객체의 str 버전을 반환합니다. 자세한 내용은 str()을 참조하십시오.

str은 내장 문자열 클래스입니다. 문자열에 대한 일반 정보는 텍스트 시퀀스 유형 — str을 참조하십시오.

sum(iterable/start=0)

합계는 왼쪽에서 오른쪽으로 iterable의 항목을 시작하고 합계를 반환합니다. iterable의 항목은 일반적으로 숫자이며 시작 값은 문자열이 될 수 없습니다.

일부 사용 사례의 경우 sum()에 대한 좋은 대안이 있습니다. 문자열 시퀀스를 연결하는 선호되는 빠른 방법은 ”.join(sequence)를 호출하는 것입니다. 확장된 정밀도로 부동 소수점 값을 추가하려면 math.fsum()을 참조하십시오. 일련의 iterable을 연결하려면 itertools.chain() 사용을 고려하십시오.

버전 3.8에서 변경: 시작 매개변수는 키워드 인수로 지정할 수 있습니다.

class super
class super(type, object_or_type=None)

메소드 호출을 유형의 부모 또는 형제 클래스에 위임하는 프록시 객체를 반환합니다. 이는 클래스에서 재정의된 상속된 메서드에 액세스하는 데 유용합니다.

object_or_type은 검색할 메서드 해결 순서를 결정합니다. 유형 바로 뒤에 있는 클래스부터 검색이 시작됩니다.

예를 들어 object_or_type의 __mro__가 D -> B -> C -> A -> object이고 type의 값이 B이면 super()는 C -> A -> object를 찾습니다.

object_or_type의 __mro__ 속성은 getattr() 및 super() 모두에서 사용되는 메서드 확인 검색 순서를 나열합니다. 속성은 동적이며 상속 계층 구조가 업데이트될 때마다 변경될 수 있습니다.

두 번째 인수가 생략되면 반환되는 슈퍼 개체는 바인딩되지 않습니다. 두 번째 인수가 객체이면 isinstance(obj, type)이 true여야 합니다. 두 번째 인수가 유형인 경우 issubclass(type2, type)은 true여야 합니다(클래스 메서드에 유용함).

슈퍼에는 두 가지 일반적인 사용 사례가 있습니다. 단일 상속이 있는 클래스 계층 구조에서 명시적으로 이름을 지정하지 않고 상위 클래스를 참조하는 데 super를 사용할 수 있으므로 코드를 보다 유지 관리하기 쉽게 만들 수 있습니다. 이 사용은 다른 프로그래밍 언어의 super 사용과 매우 유사합니다.

두 번째 사용 사례는 동적 실행 환경에서 협력적 다중 상속을 지원하는 것입니다. 이 사용 사례는 Python에 고유하며 정적으로 컴파일된 언어 또는 단일 상속만 지원하는 언어에서는 찾을 수 없습니다. 이를 통해 여러 기본 클래스가 동일한 메서드를 구현하는 “다이아몬드 다이어그램”을 구현할 수 있습니다. 좋은 설계는 그러한 구현이 모든 경우에 동일한 호출 서명을 갖도록 지시합니다(호출 순서는 런타임에 결정되기 때문에, 해당 순서는 클래스 계층 구조의 변경 사항에 적응하고 해당 순서에는 런타임 전에 알려지지 않은 형제 클래스가 포함될 수 있기 때문입니다. ).

두 사용 사례 모두에서 일반적인 슈퍼클래스 호출은 다음과 같습니다.

class C(B):
    def method(self, arg):
        super().method(arg)    # This does the same thing as:
                               # super(C, self).method(arg)

메소드 조회 외에도 super()는 속성 조회에도 작동합니다. 이에 대한 한 가지 가능한 사용 사례는 부모 또는 형제 클래스에서 설명자를 호출하는 것입니다.

super()는 super().__getitem__(name)과 같은 명시적인 점으로 구분된 속성 조회를 위한 바인딩 프로세스의 일부로 구현됩니다. 협동 다중 상속을 지원하는 예측 가능한 순서로 클래스를 검색하기 위한 자체 __getattribute__() 메서드를 구현하여 그렇게 합니다. 따라서 super()[이름]과 같은 명령문 또는 연산자를 사용하는 암시적 조회에 대해 super()는 정의되지 않습니다.

또한 인수가 0인 형식을 제외하고 super()는 내부 메서드를 사용하도록 제한되지 않습니다. 두 인수 형식은 인수를 정확하게 지정하고 적절한 참조를 만듭니다. 인수가 없는 형식은 컴파일러가 정의 중인 클래스를 올바르게 검색하고 일반적인 메서드에 대한 현재 인스턴스에 액세스하는 데 필요한 세부 정보를 채우므로 클래스 정의 내에서만 작동합니다.

super()를 사용하여 협력 클래스를 설계하는 방법에 대한 실용적인 제안은 super() 사용 가이드를 참조하세요.

class tuple
class tuple(iterable)

튜플은 함수가 아니라 실제로는 TuplesSequence Types — list, tuple, range에 설명된 대로 불변 시퀀스 유형입니다.

class type(object)
class type(namebasesdict**kwds)

하나의 인수로 객체의 유형을 반환합니다. 반환 값은 유형 개체이며 일반적으로 object.__class__가 반환하는 것과 동일한 개체입니다.

isinstance() 내장 함수는 하위 클래스를 고려하기 때문에 객체의 유형을 테스트하는 데 권장됩니다.

세 개의 인수를 사용하여 새 유형 객체를 반환합니다. 이것은 기본적으로 클래스 문의 동적 형식입니다. 이름 문자열은 클래스 이름이며 __name__ 속성이 됩니다. 기본 튜플은 기본 클래스를 포함하고 __bases__ 속성이 됩니다. 비어 있으면 모든 클래스의 최종 기반인 객체가 추가됩니다. dict 사전에는 클래스 본문에 대한 특성 및 메서드 정의가 포함되어 있습니다. __dict__ 속성이 되기 전에 복사하거나 래핑할 수 있습니다. 다음 두 문은 동일한 형식 개체를 만듭니다.

class X:
    a = 1

X = type('X', (), dict(a=1))

Type Objects도 참조하십시오.

세 개의 인수 형식에 제공된 키워드 인수는 클래스 정의(메타클래스 제외)의 키워드와 동일한 방식으로 적절한 메타클래스 기계(보통 __init_subclass__())로 전달됩니다.

Customizing class creation도 참조하십시오.

버전 3.6에서 변경: type.__new__ 를 재정의하지 않는 유형의 서브클래스는 더 이상 객체의 유형을 얻기 위해 하나의 인수 형식을 사용할 수 없습니다.

vars()
vars(object)

모듈, 클래스, 인스턴스 또는 __dict__ 속성이 있는 다른 객체에 대해 __dict__ 속성을 반환합니다.

모듈 및 인스턴스와 같은 객체에는 업데이트 가능한 __dict__ 속성이 있습니다. 그러나 다른 객체는 __dict__ 속성에 대한 쓰기 제한이 있을 수 있습니다(예: 클래스는 직접 사전 업데이트를 방지하기 위해 types.MappingProxyType 사용).

인수가 없으면 vars()는 locals()처럼 작동합니다. locals 사전에 대한 업데이트가 무시되기 때문에 locals 사전은 읽기에만 유용합니다.

객체가 지정되었지만 __dict__ 속성이 없는 경우 TypeError 예외가 발생합니다(예: 해당 클래스가 __slots__ 속성을 정의하는 경우).

zip(*iterables, strict=False)

여러 이터러블을 병렬로 반복하여 각각의 항목이 있는 튜플을 생성합니다.

예:

>>> for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']):
...     print(item)
...
(1, 'sugar')
(2, 'spice')
(3, 'everything nice')

더 공식적으로: zip()은 튜플의 이터레이터를 반환합니다. 여기서 i번째 튜플은 각 인수 iterables의 i번째 요소를 포함합니다.

zip()을 생각하는 또 다른 방법은 행을 열로, 열을 행으로 바꾸는 것입니다. 이것은 행렬을 전치하는 것과 비슷합니다.

zip() is lazy: 요소는 iterable이 반복될 때까지 처리되지 않습니다. for 루프 또는 목록으로 래핑하여.

한 가지 고려해야 할 사항은 zip()에 전달된 반복 가능 항목의 길이가 다를 수 있다는 것입니다. 때로는 의도적으로, 때로는 이러한 이터러블을 준비한 코드의 버그로 인해. Python은 이 문제를 처리하기 위해 세 가지 접근 방식을 제공합니다.

기본적으로 zip()은 가장 짧은 iterable이 소진되면 중지됩니다. 더 긴 iterables의 나머지 항목을 무시하고 결과를 가장 짧은 iterable 길이로 잘라냅니다.

>>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'])) 
[(0, 'fee'), (1, 'fi'), (2, 'fo')]

zip()은 iterables의 길이가 같다고 가정하는 경우에 자주 사용됩니다. 이러한 경우 strict=True 옵션을 사용하는 것이 좋습니다. 출력은 일반 zip()과 동일합니다.

>>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True))
[('a', 1), ('b', 2), ('c', 3)]

기본 동작과 달리 하나의 iterable이 다른 것보다 먼저 소진되면 ValueError가 발생합니다.

>>> for item in zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True):  
...     print(item)
...
(0, 'fee')
(1, 'fi')
(2, 'fo')
Traceback (most recent call last):
  ...
ValueError: zip() argument 2 is longer than argument 1

strict=True 인수가 없으면 다른 길이의 이터러블을 초래하는 모든 버그가 침묵하여 프로그램의 다른 부분에서 찾기 어려운 버그로 나타날 수 있습니다.

더 짧은 이터러블은 모든 이터러블의 길이를 동일하게 만들기 위해 상수 값으로 채워질 수 있습니다. 이것은 itertools.zip_longest()에 의해 수행됩니다.

극단적인 경우: 반복 가능한 단일 인수를 사용하면 zip()은 1-튜플의 반복자를 반환합니다. 인수가 없으면 빈 반복자를 반환합니다.

팁과 요령:

iterables의 왼쪽에서 오른쪽 평가 순서가 보장됩니다. 이는 zip(*[iter(s)]*n, strict=True)을 사용하여 데이터 계열을 n 길이 그룹으로 클러스터링하는 관용구를 가능하게 합니다. 이것은 각 출력 튜플이 반복자에 대한 n 호출의 결과를 갖도록 동일한 반복자를 n 번 반복합니다. 이는 입력을 n 길이 청크로 나누는 효과가 있습니다.

* 연산자와 함께 zip()을 사용하여 목록의 압축을 풀 수 있습니다.

>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> list(zip(x, y))
[(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = zip(*zip(x, y))
>>> x == list(x2) and y == list(y2)
True

버전 3.10에서 변경: strict 인수를 추가했습니다.

__import__(name, globals=None, locals=None, fromlist=(), level=0)

참고 이것은 importlib.import_module()과 달리 일상적인 Python 프로그래밍에 필요하지 않은 고급 기능입니다.
이 함수는 import 문에 의해 호출됩니다. import 문의 의미를 변경하기 위해 (builtins 모듈을 가져오고 builtins.__import__에 할당하여) 교체할 수 있지만 그렇게 하는 것은 일반적으로 가져오기 후크(PEP 302 참조)를 사용하는 것이 더 간단하기 때문에 강력히 권장하지 않습니다. 동일한 목표를 가지며 기본 가져오기 구현이 사용 중이라고 가정하는 코드에 문제를 일으키지 않습니다. importlib.import_module() 대신 __import__()를 직접 사용하는 것도 권장되지 않습니다.

이 함수는 패키지 컨텍스트에서 이름을 해석하는 방법을 결정하기 위해 잠재적으로 주어진 전역 및 지역을 사용하여 모듈 이름을 가져옵니다. fromlist는 이름으로 주어진 모듈에서 가져와야 하는 객체 또는 하위 모듈의 이름을 제공합니다. 표준 구현은 locals 인수를 전혀 사용하지 않고 import 문의 패키지 컨텍스트를 결정하기 위해서만 globals를 사용합니다.

level 절대 또는 상대 가져오기를 사용할지 여부를 지정합니다. 0(기본값)은 절대 가져오기만 수행함을 의미합니다. level의 양수 값은 __import__()를 호출하는 모듈의 디렉토리에 상대적으로 검색할 상위 디렉토리의 수를 나타냅니다(자세한 내용은 PEP 328 참조).

name 변수가 package.module 형식이면 일반적으로 이름으로 명명된 모듈이 아니라 최상위 패키지(첫 번째 점까지의 이름)가 반환됩니다. 그러나 비어 있지 않은 fromlist 인수가 제공되면 이름으로 명명된 모듈이 반환됩니다.

예를 들어 import spam 명령문은 다음 코드와 유사한 바이트코드를 생성합니다.

spam = __import__('spam', globals(), locals(), [], 0)

import spam.ham 명령문은 다음 호출을 생성합니다.

spam = __import__('spam.ham', globals(), locals(), [], 0)

여기서 __import__()가 최상위 모듈을 반환하는 방법에 주목하십시오. 이것이 import 문에 의해 이름에 바인딩된 객체이기 때문입니다.

반면에 spam.ham 수입 계란, 소시지를 소스로 사용한 진술은 다음과 같습니다.

_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], 0)
eggs = _temp.eggs
saus = _temp.sausage

여기서 spam.ham 모듈은 __import__()에서 반환됩니다. 이 개체에서 가져올 이름이 검색되어 해당 이름에 할당됩니다.

이름으로 모듈(잠재적으로 패키지 내)을 가져오려면 importlib.import_module()을 사용하십시오.

버전 3.3에서 변경: 수준에 대한 음수 값은 더 이상 지원되지 않습니다(기본값도 0으로 변경됨).

버전 3.9에서 변경: 명령줄 옵션 -E 또는 -I가 사용될 때 환경 변수 PYTHONCASEOK가 이제 무시됩니다.

Source: https://docs.python.org/3/library/functions.html

Introduction of Python Standard Library

“Python library”에는 여러 종류의 구성 요소가 포함되어 있습니다.

여기에는 일반적으로 숫자 및 목록과 같은 언어의 “핵심” 부분으로 간주되는 데이터 유형이 포함됩니다. 이러한 유형의 경우 Python 언어 코어는 리터럴의 형식을 정의하고 의미 체계에 일부 제약을 두지만 의미 체계를 완전히 정의하지는 않습니다. (한편, 언어 핵심은 철자 및 연산자의 우선 순위와 같은 구문 속성을 정의합니다.)

라이브러리에는 내장 함수와 예외도 포함되어 있습니다. import 문 없이도 모든 Python 코드에서 사용할 수 있는 개체입니다. 이들 중 일부는 핵심 언어에 의해 정의되지만 대부분은 핵심 의미론에 필수적이지 않으며 여기서만 설명됩니다.

그러나 대부분의 라이브러리는 모듈 모음으로 구성됩니다. 이 컬렉션을 해부하는 방법에는 여러 가지가 있습니다. 일부 모듈은 C로 작성되었으며 Python 인터프리터에 내장되어 있습니다. 다른 것들은 Python으로 작성되고 소스 형식으로 가져옵니다. 일부 모듈은 스택 추적 인쇄와 같이 Python에 매우 특정한 인터페이스를 제공합니다. 일부는 특정 하드웨어에 대한 액세스와 같이 특정 운영 체제에 특정한 인터페이스를 제공합니다. 다른 것들은 World Wide Web과 같은 특정 응용 프로그램 도메인에 특정한 인터페이스를 제공합니다. 일부 모듈은 Python의 모든 버전과 포트에서 사용할 수 있습니다. 다른 것들은 기본 시스템이 지원하거나 요구할 때만 사용할 수 있습니다. 그러나 다른 것들은 Python이 컴파일되고 설치될 때 특정 구성 옵션이 선택된 경우에만 사용할 수 있습니다.

이 설명서는 “안팎으로” 구성되어 있습니다. 먼저 내장 함수, 데이터 유형 및 예외를 설명하고 마지막으로 관련 모듈의 장으로 그룹화된 모듈을 설명합니다.

즉, 이 설명서를 처음부터 읽기 시작하고 지루해지면 다음 장으로 건너뛰면 Python 라이브러리에서 지원하는 사용 가능한 모듈 및 응용 분야에 대한 합리적인 개요를 얻을 수 있습니다. 물론 소설처럼 읽을 필요는 없습니다. 목차(매뉴얼 앞)를 찾아보거나(매뉴얼 뒤) 색인에서 특정 기능, 모듈 또는 용어를 찾을 수도 있습니다. 그리고 마지막으로 임의의 주제에 대해 배우는 것을 좋아한다면 임의의 페이지 번호(모듈 임의 참조)를 선택하고 한두 개의 섹션을 읽으십시오. 이 설명서의 섹션을 읽는 순서에 관계없이 설명서의 나머지 부분에서 이 자료에 익숙하다고 가정하므로 내장 함수 장부터 시작하는 것이 좋습니다.

쇼를 시작하자!

Notes on availability

  • “가용성: Unix” 참고는 이 기능이 Unix 시스템에서 일반적으로 발견됨을 의미합니다. 특정 운영 체제에서의 존재에 대해 주장하지 않습니다.
  • 별도로 명시되지 않은 경우 “가용성: Unix”라고 주장하는 모든 기능은 Unix 코어를 기반으로 하는 macOS에서 지원됩니다.
  • 가용성 메모에 최소 커널 버전과 최소 libc 버전이 모두 포함된 경우 두 조건이 모두 충족되어야 합니다. 예를 들어 가용성: Linux >= 3.17 with glibc >= 2.27이 있는 기능에는 Linux 3.17 이상과 glibc 2.27 이상이 모두 필요합니다.

WebAssembly platforms

WebAssembly 플랫폼 wasm32-emscripten(Emscripten) 및 wasm32-wasi(WASI)는 POSIX API의 하위 집합을 제공합니다. WebAssembly 런타임 및 브라우저는 샌드박싱되며 호스트 및 외부 리소스에 대한 액세스가 제한됩니다. 프로세스, 스레딩, 네트워킹, 신호 또는 기타 형태의 IPC(프로세스 간 통신)를 사용하는 Python 표준 라이브러리 모듈은 사용할 수 없거나 다른 Unix 계열 시스템에서처럼 작동하지 않을 수 있습니다. 파일 I/O, 파일 시스템 및 Unix 권한 관련 기능도 제한됩니다. Emscripten은 차단 I/O를 허용하지 않습니다. sleep()과 같은 다른 차단 작업은 브라우저 이벤트 루프를 차단합니다.

WebAssembly 플랫폼에서 Python의 속성 및 동작은 Emscripten-SDK 또는 WASI-SDK 버전, WASM 런타임(브라우저, NodeJS, wasmtime) 및 Python 빌드 시간 플래그에 따라 다릅니다. WebAssembly, Emscripten 및 WASI는 진화하는 표준입니다. 네트워킹과 같은 일부 기능은 향후 지원될 수 있습니다.

브라우저의 Python의 경우 사용자는 Pyodide 또는 PyScript를 고려해야 합니다. PyScript는 CPython 및 Emscripten 위에 구축된 Pyodide 위에 구축되었습니다. Pyodide는 JavaScript의 XMLHttpRequest 및 Fetch API를 통해 제한된 네트워킹 기능뿐만 아니라 브라우저의 JavaScript 및 DOM API에 대한 액세스를 제공합니다.

  • 프로세스 관련 API를 사용할 수 없거나 항상 오류와 함께 실패합니다. 여기에는 새 프로세스(fork(), execve())를 생성하거나 프로세스를 기다리거나(waitpid()) 신호를 보내거나(kill()) 프로세스와 상호 작용하는 API가 포함됩니다. 하위 프로세스는 가져올 수 있지만 작동하지 않습니다.
  • 소켓 모듈을 사용할 수 있지만 제한적이며 다른 플랫폼과 다르게 작동합니다. Emscripten에서 소켓은 항상 비차단이며 WebSocket을 통해 TCP를 프록시하려면 서버에 추가 JavaScript 코드와 도우미가 필요합니다. 자세한 내용은 Emscripten 네트워킹을 참조하십시오. WASI 스냅샷 미리보기 1은 기존 파일 디스크립터의 소켓만 허용합니다.
  • 일부 함수는 아무 작업도 수행하지 않고 항상 하드코딩된 값을 반환하는 스텁입니다.
  • 파일 설명자, 파일 권한, 파일 소유권 및 링크와 관련된 기능이 제한되며 일부 작업을 지원하지 않습니다. 예를 들어 WASI는 절대 파일 이름을 사용하는 심볼릭 링크를 허용하지 않습니다.

Source: https://docs.python.org/3/library/intro.html

Python Language Reference > 10. Full Grammar specification

이것은 CPython 파서를 생성하는 데 사용된 문법에서 직접 파생된 전체 Python 문법입니다(Grammar/python.gram 참조). 여기서 버전은 코드 생성 및 오류 복구와 관련된 세부 정보를 생략합니다.

표기법은 EBNFPEG의 혼합입니다. 특히 기호, 토큰 또는 괄호로 묶인 그룹이 뒤에 오는 &는 긍정적인 예측(즉, 일치해야 하지만 소비되지 않음)을 나타내는 반면 ! 부정적 예측을 나타냅니다(즉, 일치하지 않아야 함). 우리는 | PEG의 “순서가 지정된 선택”을 의미하는 구분 기호(전통적인 PEG 문법으로 /로 작성됨). 문법 구문에 대한 자세한 내용은 PEP 617을 참조하십시오.

# PEG grammar for Python



# ========================= START OF THE GRAMMAR =========================

# General grammatical elements and rules:
#
# * Strings with double quotes (") denote SOFT KEYWORDS
# * Strings with single quotes (') denote KEYWORDS
# * Upper case names (NAME) denote tokens in the Grammar/Tokens file
# * Rule names starting with "invalid_" are used for specialized syntax errors
#     - These rules are NOT used in the first pass of the parser.
#     - Only if the first pass fails to parse, a second pass including the invalid
#       rules will be executed.
#     - If the parser fails in the second phase with a generic syntax error, the
#       location of the generic failure of the first pass will be used (this avoids
#       reporting incorrect locations due to the invalid rules).
#     - The order of the alternatives involving invalid rules matter
#       (like any rule in PEG).
#
# Grammar Syntax (see PEP 617 for more information):
#
# rule_name: expression
#   Optionally, a type can be included right after the rule name, which
#   specifies the return type of the C or Python function corresponding to the
#   rule:
# rule_name[return_type]: expression
#   If the return type is omitted, then a void * is returned in C and an Any in
#   Python.
# e1 e2
#   Match e1, then match e2.
# e1 | e2
#   Match e1 or e2.
#   The first alternative can also appear on the line after the rule name for
#   formatting purposes. In that case, a | must be used before the first
#   alternative, like so:
#       rule_name[return_type]:
#            | first_alt
#            | second_alt
# ( e )
#   Match e (allows also to use other operators in the group like '(e)*')
# [ e ] or e?
#   Optionally match e.
# e*
#   Match zero or more occurrences of e.
# e+
#   Match one or more occurrences of e.
# s.e+
#   Match one or more occurrences of e, separated by s. The generated parse tree
#   does not include the separator. This is otherwise identical to (e (s e)*).
# &e
#   Succeed if e can be parsed, without consuming any input.
# !e
#   Fail if e can be parsed, without consuming any input.
# ~
#   Commit to the current alternative, even if it fails to parse.
#

# STARTING RULES
# ==============

file: [statements] ENDMARKER 
interactive: statement_newline 
eval: expressions NEWLINE* ENDMARKER 
func_type: '(' [type_expressions] ')' '->' expression NEWLINE* ENDMARKER 
fstring: star_expressions

# GENERAL STATEMENTS
# ==================

statements: statement+ 

statement: compound_stmt  | simple_stmts 

statement_newline:
    | compound_stmt NEWLINE 
    | simple_stmts
    | NEWLINE 
    | ENDMARKER 

simple_stmts:
    | simple_stmt !';' NEWLINE  # Not needed, there for speedup
    | ';'.simple_stmt+ [';'] NEWLINE 

# NOTE: assignment MUST precede expression, else parsing a simple assignment
# will throw a SyntaxError.
simple_stmt:
    | assignment
    | star_expressions 
    | return_stmt
    | import_stmt
    | raise_stmt
    | 'pass' 
    | del_stmt
    | yield_stmt
    | assert_stmt
    | 'break' 
    | 'continue' 
    | global_stmt
    | nonlocal_stmt

compound_stmt:
    | function_def
    | if_stmt
    | class_def
    | with_stmt
    | for_stmt
    | try_stmt
    | while_stmt
    | match_stmt

# SIMPLE STATEMENTS
# =================

# NOTE: annotated_rhs may start with 'yield'; yield_expr must start with 'yield'
assignment:
    | NAME ':' expression ['=' annotated_rhs ] 
    | ('(' single_target ')' 
         | single_subscript_attribute_target) ':' expression ['=' annotated_rhs ] 
    | (star_targets '=' )+ (yield_expr | star_expressions) !'=' [TYPE_COMMENT] 
    | single_target augassign ~ (yield_expr | star_expressions) 

annotated_rhs: yield_expr | star_expressions

augassign:
    | '+=' 
    | '-=' 
    | '*=' 
    | '@=' 
    | '/=' 
    | '%=' 
    | '&=' 
    | '|=' 
    | '^=' 
    | '<<=' 
    | '>>=' 
    | '**=' 
    | '//=' 

return_stmt:
    | 'return' [star_expressions] 

raise_stmt:
    | 'raise' expression ['from' expression ] 
    | 'raise' 

global_stmt: 'global' ','.NAME+ 

nonlocal_stmt: 'nonlocal' ','.NAME+ 

del_stmt:
    | 'del' del_targets &(';' | NEWLINE) 

yield_stmt: yield_expr 

assert_stmt: 'assert' expression [',' expression ] 

import_stmt: import_name | import_from

# Import statements
# -----------------

import_name: 'import' dotted_as_names 
# note below: the ('.' | '...') is necessary because '...' is tokenized as ELLIPSIS
import_from:
    | 'from' ('.' | '...')* dotted_name 'import' import_from_targets 
    | 'from' ('.' | '...')+ 'import' import_from_targets 
import_from_targets:
    | '(' import_from_as_names [','] ')' 
    | import_from_as_names !','
    | '*' 
import_from_as_names:
    | ','.import_from_as_name+ 
import_from_as_name:
    | NAME ['as' NAME ] 
dotted_as_names:
    | ','.dotted_as_name+ 
dotted_as_name:
    | dotted_name ['as' NAME ] 
dotted_name:
    | dotted_name '.' NAME 
    | NAME

# COMPOUND STATEMENTS
# ===================

# Common elements
# ---------------

block:
    | NEWLINE INDENT statements DEDENT 
    | simple_stmts

decorators: ('@' named_expression NEWLINE )+ 

# Class definitions
# -----------------

class_def:
    | decorators class_def_raw 
    | class_def_raw

class_def_raw:
    | 'class' NAME ['(' [arguments] ')' ] ':' block 

# Function definitions
# --------------------

function_def:
    | decorators function_def_raw 
    | function_def_raw

function_def_raw:
    | 'def' NAME '(' [params] ')' ['->' expression ] ':' [func_type_comment] block 
    | ASYNC 'def' NAME '(' [params] ')' ['->' expression ] ':' [func_type_comment] block 

# Function parameters
# -------------------

params:
    | parameters

parameters:
    | slash_no_default param_no_default* param_with_default* [star_etc] 
    | slash_with_default param_with_default* [star_etc] 
    | param_no_default+ param_with_default* [star_etc] 
    | param_with_default+ [star_etc] 
    | star_etc 

# Some duplication here because we can't write (',' | &')'),
# which is because we don't support empty alternatives (yet).

slash_no_default:
    | param_no_default+ '/' ',' 
    | param_no_default+ '/' &')' 
slash_with_default:
    | param_no_default* param_with_default+ '/' ',' 
    | param_no_default* param_with_default+ '/' &')' 

star_etc:
    | '*' param_no_default param_maybe_default* [kwds] 
    | '*' param_no_default_star_annotation param_maybe_default* [kwds] 
    | '*' ',' param_maybe_default+ [kwds] 
    | kwds 

kwds:
    | '**' param_no_default 

# One parameter.  This *includes* a following comma and type comment.
#
# There are three styles:
# - No default
# - With default
# - Maybe with default
#
# There are two alternative forms of each, to deal with type comments:
# - Ends in a comma followed by an optional type comment
# - No comma, optional type comment, must be followed by close paren
# The latter form is for a final parameter without trailing comma.
#

param_no_default:
    | param ',' TYPE_COMMENT? 
    | param TYPE_COMMENT? &')' 
param_no_default_star_annotation:
    | param_star_annotation ',' TYPE_COMMENT? 
    | param_star_annotation TYPE_COMMENT? &')' 
param_with_default:
    | param default ',' TYPE_COMMENT? 
    | param default TYPE_COMMENT? &')' 
param_maybe_default:
    | param default? ',' TYPE_COMMENT? 
    | param default? TYPE_COMMENT? &')' 
param: NAME annotation? 
param_star_annotation: NAME star_annotation 
annotation: ':' expression 
star_annotation: ':' star_expression 
default: '=' expression  | invalid_default

# If statement
# ------------

if_stmt:
    | 'if' named_expression ':' block elif_stmt 
    | 'if' named_expression ':' block [else_block] 
elif_stmt:
    | 'elif' named_expression ':' block elif_stmt 
    | 'elif' named_expression ':' block [else_block] 
else_block:
    | 'else' ':' block 

# While statement
# ---------------

while_stmt:
    | 'while' named_expression ':' block [else_block] 

# For statement
# -------------

for_stmt:
    | 'for' star_targets 'in' ~ star_expressions ':' [TYPE_COMMENT] block [else_block] 
    | ASYNC 'for' star_targets 'in' ~ star_expressions ':' [TYPE_COMMENT] block [else_block] 

# With statement
# --------------

with_stmt:
    | 'with' '(' ','.with_item+ ','? ')' ':' block 
    | 'with' ','.with_item+ ':' [TYPE_COMMENT] block 
    | ASYNC 'with' '(' ','.with_item+ ','? ')' ':' block 
    | ASYNC 'with' ','.with_item+ ':' [TYPE_COMMENT] block 

with_item:
    | expression 'as' star_target &(',' | ')' | ':') 
    | expression 

# Try statement
# -------------

try_stmt:
    | 'try' ':' block finally_block 
    | 'try' ':' block except_block+ [else_block] [finally_block] 
    | 'try' ':' block except_star_block+ [else_block] [finally_block] 


# Except statement
# ----------------

except_block:
    | 'except' expression ['as' NAME ] ':' block 
    | 'except' ':' block 
except_star_block:
    | 'except' '*' expression ['as' NAME ] ':' block 
finally_block:
    | 'finally' ':' block 

# Match statement
# ---------------

match_stmt:
    | "match" subject_expr ':' NEWLINE INDENT case_block+ DEDENT 

subject_expr:
    | star_named_expression ',' star_named_expressions? 
    | named_expression

case_block:
    | "case" patterns guard? ':' block 

guard: 'if' named_expression 

patterns:
    | open_sequence_pattern 
    | pattern

pattern:
    | as_pattern
    | or_pattern

as_pattern:
    | or_pattern 'as' pattern_capture_target 

or_pattern:
    | '|'.closed_pattern+ 

closed_pattern:
    | literal_pattern
    | capture_pattern
    | wildcard_pattern
    | value_pattern
    | group_pattern
    | sequence_pattern
    | mapping_pattern
    | class_pattern

# Literal patterns are used for equality and identity constraints
literal_pattern:
    | signed_number !('+' | '-') 
    | complex_number 
    | strings 
    | 'None' 
    | 'True' 
    | 'False' 

# Literal expressions are used to restrict permitted mapping pattern keys
literal_expr:
    | signed_number !('+' | '-')
    | complex_number
    | strings
    | 'None' 
    | 'True' 
    | 'False' 

complex_number:
    | signed_real_number '+' imaginary_number 
    | signed_real_number '-' imaginary_number  

signed_number:
    | NUMBER
    | '-' NUMBER 

signed_real_number:
    | real_number
    | '-' real_number 

real_number:
    | NUMBER 

imaginary_number:
    | NUMBER 

capture_pattern:
    | pattern_capture_target 

pattern_capture_target:
    | !"_" NAME !('.' | '(' | '=') 

wildcard_pattern:
    | "_" 

value_pattern:
    | attr !('.' | '(' | '=') 

attr:
    | name_or_attr '.' NAME 

name_or_attr:
    | attr
    | NAME

group_pattern:
    | '(' pattern ')' 

sequence_pattern:
    | '[' maybe_sequence_pattern? ']' 
    | '(' open_sequence_pattern? ')' 

open_sequence_pattern:
    | maybe_star_pattern ',' maybe_sequence_pattern? 

maybe_sequence_pattern:
    | ','.maybe_star_pattern+ ','? 

maybe_star_pattern:
    | star_pattern
    | pattern

star_pattern:
    | '*' pattern_capture_target 
    | '*' wildcard_pattern 

mapping_pattern:
    | '{' '}' 
    | '{' double_star_pattern ','? '}' 
    | '{' items_pattern ',' double_star_pattern ','? '}' 
    | '{' items_pattern ','? '}' 

items_pattern:
    | ','.key_value_pattern+

key_value_pattern:
    | (literal_expr | attr) ':' pattern 

double_star_pattern:
    | '**' pattern_capture_target 

class_pattern:
    | name_or_attr '(' ')' 
    | name_or_attr '(' positional_patterns ','? ')' 
    | name_or_attr '(' keyword_patterns ','? ')' 
    | name_or_attr '(' positional_patterns ',' keyword_patterns ','? ')' 

positional_patterns:
    | ','.pattern+ 

keyword_patterns:
    | ','.keyword_pattern+

keyword_pattern:
    | NAME '=' pattern 

# EXPRESSIONS
# -----------

expressions:
    | expression (',' expression )+ [','] 
    | expression ',' 
    | expression

expression:
    | disjunction 'if' disjunction 'else' expression 
    | disjunction
    | lambdef

yield_expr:
    | 'yield' 'from' expression 
    | 'yield' [star_expressions] 

star_expressions:
    | star_expression (',' star_expression )+ [','] 
    | star_expression ',' 
    | star_expression

star_expression:
    | '*' bitwise_or 
    | expression

star_named_expressions: ','.star_named_expression+ [','] 

star_named_expression:
    | '*' bitwise_or 
    | named_expression

assignment_expression:
    | NAME ':=' ~ expression 

named_expression:
    | assignment_expression
    | expression !':='

disjunction:
    | conjunction ('or' conjunction )+ 
    | conjunction

conjunction:
    | inversion ('and' inversion )+ 
    | inversion

inversion:
    | 'not' inversion 
    | comparison

# Comparison operators
# --------------------

comparison:
    | bitwise_or compare_op_bitwise_or_pair+ 
    | bitwise_or

compare_op_bitwise_or_pair:
    | eq_bitwise_or
    | noteq_bitwise_or
    | lte_bitwise_or
    | lt_bitwise_or
    | gte_bitwise_or
    | gt_bitwise_or
    | notin_bitwise_or
    | in_bitwise_or
    | isnot_bitwise_or
    | is_bitwise_or

eq_bitwise_or: '==' bitwise_or 
noteq_bitwise_or:
    | ('!=' ) bitwise_or 
lte_bitwise_or: '<=' bitwise_or 
lt_bitwise_or: '<' bitwise_or 
gte_bitwise_or: '>=' bitwise_or 
gt_bitwise_or: '>' bitwise_or 
notin_bitwise_or: 'not' 'in' bitwise_or 
in_bitwise_or: 'in' bitwise_or 
isnot_bitwise_or: 'is' 'not' bitwise_or 
is_bitwise_or: 'is' bitwise_or 

# Bitwise operators
# -----------------

bitwise_or:
    | bitwise_or '|' bitwise_xor 
    | bitwise_xor

bitwise_xor:
    | bitwise_xor '^' bitwise_and 
    | bitwise_and

bitwise_and:
    | bitwise_and '&' shift_expr 
    | shift_expr

shift_expr:
    | shift_expr '<<' sum 
    | shift_expr '>>' sum 
    | sum

# Arithmetic operators
# --------------------

sum:
    | sum '+' term 
    | sum '-' term 
    | term

term:
    | term '*' factor 
    | term '/' factor 
    | term '//' factor 
    | term '%' factor 
    | term '@' factor 
    | factor

factor:
    | '+' factor 
    | '-' factor 
    | '~' factor 
    | power

power:
    | await_primary '**' factor 
    | await_primary

# Primary elements
# ----------------

# Primary elements are things like "obj.something.something", "obj[something]", "obj(something)", "obj" ...

await_primary:
    | AWAIT primary 
    | primary

primary:
    | primary '.' NAME 
    | primary genexp 
    | primary '(' [arguments] ')' 
    | primary '[' slices ']' 
    | atom

slices:
    | slice !',' 
    | ','.(slice | starred_expression)+ [','] 

slice:
    | [expression] ':' [expression] [':' [expression] ] 
    | named_expression 

atom:
    | NAME
    | 'True' 
    | 'False' 
    | 'None' 
    | strings
    | NUMBER
    | (tuple | group | genexp)
    | (list | listcomp)
    | (dict | set | dictcomp | setcomp)
    | '...' 

group:
    | '(' (yield_expr | named_expression) ')' 

# Lambda functions
# ----------------

lambdef:
    | 'lambda' [lambda_params] ':' expression 

lambda_params:
    | lambda_parameters

# lambda_parameters etc. duplicates parameters but without annotations
# or type comments, and if there's no comma after a parameter, we expect
# a colon, not a close parenthesis.  (For more, see parameters above.)
#
lambda_parameters:
    | lambda_slash_no_default lambda_param_no_default* lambda_param_with_default* [lambda_star_etc] 
    | lambda_slash_with_default lambda_param_with_default* [lambda_star_etc] 
    | lambda_param_no_default+ lambda_param_with_default* [lambda_star_etc] 
    | lambda_param_with_default+ [lambda_star_etc] 
    | lambda_star_etc 

lambda_slash_no_default:
    | lambda_param_no_default+ '/' ',' 
    | lambda_param_no_default+ '/' &':' 

lambda_slash_with_default:
    | lambda_param_no_default* lambda_param_with_default+ '/' ',' 
    | lambda_param_no_default* lambda_param_with_default+ '/' &':' 

lambda_star_etc:
    | '*' lambda_param_no_default lambda_param_maybe_default* [lambda_kwds] 
    | '*' ',' lambda_param_maybe_default+ [lambda_kwds] 
    | lambda_kwds 

lambda_kwds:
    | '**' lambda_param_no_default 

lambda_param_no_default:
    | lambda_param ',' 
    | lambda_param &':' 
lambda_param_with_default:
    | lambda_param default ',' 
    | lambda_param default &':' 
lambda_param_maybe_default:
    | lambda_param default? ',' 
    | lambda_param default? &':' 
lambda_param: NAME 

# LITERALS
# ========

strings: STRING+ 

list:
    | '[' [star_named_expressions] ']' 

tuple:
    | '(' [star_named_expression ',' [star_named_expressions]  ] ')' 

set: '{' star_named_expressions '}' 

# Dicts
# -----

dict:
    | '{' [double_starred_kvpairs] '}' 

double_starred_kvpairs: ','.double_starred_kvpair+ [','] 

double_starred_kvpair:
    | '**' bitwise_or 
    | kvpair

kvpair: expression ':' expression 

# Comprehensions & Generators
# ---------------------------

for_if_clauses:
    | for_if_clause+ 

for_if_clause:
    | ASYNC 'for' star_targets 'in' ~ disjunction ('if' disjunction )* 
    | 'for' star_targets 'in' ~ disjunction ('if' disjunction )* 

listcomp:
    | '[' named_expression for_if_clauses ']' 

setcomp:
    | '{' named_expression for_if_clauses '}' 

genexp:
    | '(' ( assignment_expression | expression !':=') for_if_clauses ')' 

dictcomp:
    | '{' kvpair for_if_clauses '}' 

# FUNCTION CALL ARGUMENTS
# =======================

arguments:
    | args [','] &')' 

args:
    | ','.(starred_expression | ( assignment_expression | expression !':=') !'=')+ [',' kwargs ] 
    | kwargs 

kwargs:
    | ','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+ 
    | ','.kwarg_or_starred+
    | ','.kwarg_or_double_starred+

starred_expression:
    | '*' expression 

kwarg_or_starred:
    | NAME '=' expression 
    | starred_expression 

kwarg_or_double_starred:
    | NAME '=' expression 
    | '**' expression 

# ASSIGNMENT TARGETS
# ==================

# Generic targets
# ---------------

# NOTE: star_targets may contain *bitwise_or, targets may not.
star_targets:
    | star_target !',' 
    | star_target (',' star_target )* [','] 

star_targets_list_seq: ','.star_target+ [','] 

star_targets_tuple_seq:
    | star_target (',' star_target )+ [','] 
    | star_target ',' 

star_target:
    | '*' (!'*' star_target) 
    | target_with_star_atom

target_with_star_atom:
    | t_primary '.' NAME !t_lookahead 
    | t_primary '[' slices ']' !t_lookahead 
    | star_atom

star_atom:
    | NAME 
    | '(' target_with_star_atom ')' 
    | '(' [star_targets_tuple_seq] ')' 
    | '[' [star_targets_list_seq] ']' 

single_target:
    | single_subscript_attribute_target
    | NAME 
    | '(' single_target ')' 

single_subscript_attribute_target:
    | t_primary '.' NAME !t_lookahead 
    | t_primary '[' slices ']' !t_lookahead 

t_primary:
    | t_primary '.' NAME &t_lookahead 
    | t_primary '[' slices ']' &t_lookahead 
    | t_primary genexp &t_lookahead 
    | t_primary '(' [arguments] ')' &t_lookahead 
    | atom &t_lookahead 

t_lookahead: '(' | '[' | '.'

# Targets for del statements
# --------------------------

del_targets: ','.del_target+ [','] 

del_target:
    | t_primary '.' NAME !t_lookahead 
    | t_primary '[' slices ']' !t_lookahead 
    | del_t_atom

del_t_atom:
    | NAME 
    | '(' del_target ')' 
    | '(' [del_targets] ')' 
    | '[' [del_targets] ']' 

# TYPING ELEMENTS
# ---------------

# type_expressions allow */** but ignore them
type_expressions:
    | ','.expression+ ',' '*' expression ',' '**' expression 
    | ','.expression+ ',' '*' expression 
    | ','.expression+ ',' '**' expression 
    | '*' expression ',' '**' expression 
    | '*' expression 
    | '**' expression 
    | ','.expression+ 

func_type_comment:
    | NEWLINE TYPE_COMMENT &(NEWLINE INDENT)   # Must be followed by indented block
    | TYPE_COMMENT

# ========================= END OF THE GRAMMAR ===========================



# ========================= START OF INVALID RULES =======================

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

Python Language Reference > 9. Top-level components

파이썬 인터프리터는 표준 입력 또는 프로그램 인수로 전달된 스크립트, 대화식으로 입력된 모듈 소스 파일 등 여러 소스에서 입력을 얻을 수 있습니다. 이 장에서는 이러한 경우에 사용되는 구문을 제공합니다.

9.1. Complete Python programs

언어 사양이 언어 인터프리터가 호출되는 방법을 규정할 필요는 없지만 완전한 Python 프로그램의 개념을 갖는 것이 유용합니다. 완전한 Python 프로그램은 최소한으로 초기화된 환경에서 실행됩니다. 모든 내장 및 표준 모듈을 사용할 수 있지만 sys(다양한 시스템 서비스), 내장(내장 함수, 예외 및 없음) 및 __main__을 제외하고는 초기화되지 않았습니다. . 후자는 전체 프로그램 실행을 위한 로컬 및 전역 네임스페이스를 제공하는 데 사용됩니다.

완전한 Python 프로그램의 구문은 다음 섹션에서 설명하는 파일 입력용 구문입니다.

인터프리터는 대화식 모드에서도 호출할 수 있습니다. 이 경우 완전한 프로그램을 읽고 실행하는 것이 아니라 한 번에 하나의 명령문(아마도 복합)을 읽고 실행합니다. 초기 환경은 완전한 프로그램의 환경과 동일합니다. 각 명령문은 __main__의 네임스페이스에서 실행됩니다.

완전한 프로그램은 세 가지 형식으로 인터프리터에 전달될 수 있습니다: -c 문자열 명령줄 옵션 사용, 첫 번째 명령줄 인수로 전달된 파일 또는 표준 입력. 파일이나 표준 입력이 tty 장치이면 인터프리터는 대화형 모드로 들어갑니다. 그렇지 않으면 파일을 완전한 프로그램으로 실행합니다.

9.2. File input

비대화형 파일에서 읽은 모든 입력 형식은 다음과 같습니다.

file_input ::=  (NEWLINE | statement)*

이 구문은 다음 상황에서 사용됩니다.

  • 완전한 Python 프로그램을 구문 분석할 때(파일 또는 문자열에서);
  • 모듈을 파싱할 때;
  • exec() 함수에 전달된 문자열을 구문 분석할 때;

9.3. Interactive input

대화형 모드의 입력은 다음 문법을 사용하여 구문 분석됩니다.

interactive_input ::=  [stmt_list] NEWLINE | compound_stmt NEWLINE

대화형 모드에서는 (최상위) 복합 명령문 뒤에 빈 줄이 와야 합니다. 이는 구문 분석기가 입력의 끝을 감지하는 데 필요합니다.

9.4. Expression input

eval()은 표현식 입력에 사용됩니다. 선행 공백을 무시합니다. eval()에 대한 문자열 인수는 다음 형식이어야 합니다.

eval_input ::=  expression_list NEWLINE*

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

Python Language Reference > 8. Compound statements

복합 문에는 다른 문(그룹)이 포함됩니다. 어떤 식으로든 다른 명령문의 실행에 영향을 미치거나 제어합니다. 일반적으로 복합문은 여러 줄에 걸쳐 있지만 단순한 화신에서는 전체 복합문이 한 줄에 포함될 수 있습니다.

if, while 및 for 문은 전통적인 제어 흐름 구조를 구현합니다. try는 문 그룹에 대한 예외 처리기 및/또는 정리 코드를 지정하는 반면 with 문은 코드 블록 주위에서 초기화 및 종료 코드를 실행할 수 있도록 합니다. 함수 및 클래스 정의도 구문적으로 복합 명령문입니다.

복합문은 하나 이상의 ‘절’로 구성됩니다. 절은 헤더와 ‘스위트’로 구성됩니다. 특정 복합문의 절 헤더는 모두 동일한 들여쓰기 수준에 있습니다. 각 절 헤더는 고유하게 식별되는 키워드로 시작하고 콜론으로 끝납니다. 스위트는 절에 의해 제어되는 명령문 그룹입니다. 스위트는 헤더 콜론 다음의 헤더와 같은 줄에 있는 하나 이상의 세미콜론으로 구분된 간단한 문이거나 후속 줄에 있는 하나 이상의 들여쓰기된 문일 수 있습니다. 스위트의 후자 형식만이 중첩된 복합 명령문을 포함할 수 있습니다. 다음은 위법입니다. 주로 다음 else 절이 어떤 if 절에 속하는지 명확하지 않기 때문입니다.

if test1: if test2: print(x)

또한 세미콜론은 이 컨텍스트에서 콜론보다 더 밀접하게 바인딩되므로 다음 예제에서는 print() 호출이 모두 실행되거나 전혀 실행되지 않습니다.

if x < y < z: print(x); print(y); print(z)

요약:

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]

명령문은 항상 NEWLINE으로 끝나고 그 뒤에 DEDENT가 올 수 있음에 유의하십시오. 또한 선택적 연속 절은 항상 명령문을 시작할 수 없는 키워드로 시작하므로 모호성이 없습니다(파이썬에서 ‘dangling else’ 문제는 중첩된 if 문을 들여쓰도록 요구하여 해결됨).

다음 섹션의 문법 규칙 형식은 명확성을 위해 각 절을 별도의 줄에 배치합니다.

8.1. The if statement

if 문은 조건부 실행에 사용됩니다.

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]

참이 될 때까지 표현식을 하나씩 평가하여 스위트 중 정확히 하나를 선택합니다(참과 거짓의 정의에 대한 부울 연산 섹션 참조). 그런 다음 해당 제품군이 실행됩니다(그리고 if 문의 다른 부분은 실행되거나 평가되지 않습니다). 모든 식이 거짓이면 else 절의 모음(있는 경우)이 실행됩니다.

8.2. The while statement

while 문은 표현식이 참인 동안 반복 실행에 사용됩니다.

while_stmt ::=  "while" assignment_expression ":" suite
                ["else" ":" suite]

이것은 표현식을 반복적으로 테스트하고 참이면 첫 번째 스위트를 실행합니다. 표현식이 거짓이면(첫 번째 테스트일 수 있음) else 절의 스위트(존재하는 경우)가 실행되고 루프가 종료됩니다.

첫 번째 모음에서 실행되는 break 문은 else 절의 모음을 실행하지 않고 루프를 종료합니다. 첫 번째 스위트에서 실행되는 continue 문은 나머지 스위트를 건너뛰고 표현식 테스트로 돌아갑니다.

8.3. The for statement

for 문은 시퀀스(예: 문자열, 튜플 또는 목록) 또는 기타 반복 가능한 객체의 요소를 반복하는 데 사용됩니다.

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]

stard_list 표현식은 한 번 평가됩니다. iterable 객체를 생성해야 합니다. 해당 iterable에 대해 iterator가 생성됩니다. 반복자가 제공한 첫 번째 항목은 할당에 대한 표준 규칙(할당문 참조)을 사용하여 대상 목록에 할당되고 제품군이 실행됩니다. 이것은 반복자가 제공하는 각 항목에 대해 반복됩니다. 반복자가 소진되면 else 절의 스위트(있는 경우)가 실행되고 루프가 종료됩니다.

첫 번째 모음에서 실행되는 break 문은 else 절의 모음을 실행하지 않고 루프를 종료합니다. 첫 번째 스위트에서 실행되는 continue 문은 스위트의 나머지 부분을 건너뛰고 다음 항목으로 계속 진행하거나 다음 항목이 없는 경우 else 절로 계속됩니다.

for 루프는 대상 목록의 변수에 할당합니다. 이렇게 하면 for 루프 제품군에서 만든 변수를 포함하여 해당 변수에 대한 모든 이전 할당을 덮어씁니다.

for i in range(10):
    print(i)
    i = 5             # this will not affect the for-loop
                      # because i will be overwritten with the next
                      # index in the range

대상 목록의 이름은 루프가 종료될 때 삭제되지 않지만 시퀀스가 비어 있으면 루프에 의해 할당되지 않습니다. 힌트: 내장 유형 range()는 정수의 불변 산술 시퀀스를 나타냅니다. 예를 들어 range(3)를 반복하면 0, 1, 2가 차례로 생성됩니다.

버전 3.11에서 변경: 이제 별표 표시된 요소가 표현식 목록에서 허용됩니다.

8.4. The try statement

try 문은 문 그룹에 대한 예외 처리기 및/또는 정리 코드를 지정합니다.

try_stmt  ::=  try1_stmt | try2_stmt | try3_stmt
try1_stmt ::=  "try" ":" suite
               ("except" [expression ["as" identifier]] ":" suite)+
               ["else" ":" suite]
               ["finally" ":" suite]
try2_stmt ::=  "try" ":" suite
               ("except" "*" expression ["as" identifier] ":" suite)+
               ["else" ":" suite]
               ["finally" ":" suite]
try3_stmt ::=  "try" ":" suite
               "finally" ":" suite

예외에 대한 추가 정보는 예외 섹션에서 찾을 수 있으며, raise 문을 사용하여 예외를 생성하는 방법에 대한 정보는 raise 문 섹션에서 찾을 수 있습니다.

8.4.1. except clause

except 절은 하나 이상의 예외 핸들러를 지정합니다. try 절에서 예외가 발생하지 않으면 예외 처리기가 실행되지 않습니다. try 제품군에서 예외가 발생하면 예외 처리기 검색이 시작됩니다. 이 검색은 예외와 일치하는 항목을 찾을 때까지 차례로 except 절을 검사합니다. 표현식이 없는 except 절이 있는 경우 마지막이어야 합니다. 모든 예외와 일치합니다. 식이 포함된 except 절의 경우 해당 식이 평가되고 결과 개체가 예외와 “호환”되는 경우 절이 예외와 일치합니다. 개체가 예외 개체의 클래스 또는 비가상 기본 클래스이거나 예외 개체의 클래스 또는 비가상 기본 클래스인 항목을 포함하는 튜플인 경우 개체는 예외와 호환됩니다.

예외와 일치하는 절이 없으면 주변 코드와 호출 스택에서 예외 처리기에 대한 검색이 계속됩니다. 1

except 절의 헤더에 있는 표현식 평가에서 예외가 발생하면 핸들러에 대한 원래 검색이 취소되고 주변 코드와 호출 스택에서 새 예외에 대한 검색이 시작됩니다(전체 try 문에서 예외가 발생했습니다).

일치하는 except 절이 발견되면, 해당 except 절에서 as 키워드 뒤에 지정된 대상에 예외가 할당되고(있는 경우), except 절의 스위트가 실행됩니다. 모든 except 절에는 실행 가능한 블록이 있어야 합니다. 이 블록의 끝에 도달하면 전체 try 문 이후 실행이 정상적으로 계속됩니다. (이는 동일한 예외에 대해 두 개의 중첩 처리기가 존재하고 내부 처리기의 try 절에서 예외가 발생하면 외부 처리기가 예외를 처리하지 않음을 의미합니다.)

대상으로 사용하여 예외가 할당되면 except 절의 끝에서 지워집니다.

이것은 마치 아래 코드가

except E as N:
    foo

아래와 같이 번역되는 것과 같습니다.

except E as N:
    try:
        foo
    finally:
        del N

즉, except 절 뒤에서 예외를 참조할 수 있으려면 예외를 다른 이름에 지정해야 합니다. 트레이스백이 첨부되어 있기 때문에 예외는 지워집니다. 스택 프레임과 함께 참조 순환을 형성하여 다음 가비지 수집이 발생할 때까지 해당 프레임의 모든 로컬을 활성 상태로 유지합니다.

예외 절의 모음이 실행되기 전에 예외에 대한 세부 정보가 sys 모듈에 저장되고 sys.exc_info()를 통해 액세스할 수 있습니다. sys.exc_info()는 예외 클래스, 예외 인스턴스 및 예외가 발생한 프로그램의 지점을 식별하는 역추적 객체(표준 유형 계층 섹션 참조)로 구성된 3-튜플을 반환합니다. sys.exc_info()를 통해 액세스된 예외에 대한 세부 정보는 예외 처리기를 떠날 때 이전 값으로 복원됩니다.

>>> print(sys.exc_info())
(None, None, None)
>>> try:
...     raise TypeError
... except:
...     print(sys.exc_info())
...     try:
...          raise ValueError
...     except:
...         print(sys.exc_info())
...     print(sys.exc_info())
... 
(<class 'TypeError'>, TypeError(), <traceback object at 0x10efad080>)
(<class 'ValueError'>, ValueError(), <traceback object at 0x10efad040>)
(<class 'TypeError'>, TypeError(), <traceback object at 0x10efad080>)
>>> print(sys.exc_info())
(None, None, None)

8.4.2. except* clause

except* 절은 ExceptionGroup을 처리하는 데 사용됩니다. 일치를 위한 예외 유형은 예외의 경우와 같이 해석되지만 예외 그룹의 경우 유형이 그룹의 일부 예외와 일치할 때 부분 일치를 가질 수 있습니다. 즉, 각각 예외 그룹의 일부를 처리하는 여러 except* 절이 실행될 수 있습니다. 각 절은 최대 한 번 실행되며 일치하는 모든 예외의 예외 그룹을 처리합니다. 그룹의 각 예외는 일치하는 첫 번째 절인 최대 하나의 except* 절에 의해 처리됩니다.

>>> try:
...     raise ExceptionGroup("eg",
...         [ValueError(1), TypeError(2), OSError(3), OSError(4)])
... except* TypeError as e:
...     print(f'caught {type(e)} with nested {e.exceptions}')
... except* OSError as e:
...     print(f'caught {type(e)} with nested {e.exceptions}')
... 
caught <class 'ExceptionGroup'> with nested (TypeError(2),)
caught <class 'ExceptionGroup'> with nested (OSError(3), OSError(4))
  + Exception Group Traceback (most recent call last):
  |   File "<stdin>", line 2, in <module>
  | ExceptionGroup: eg
  +-+---------------- 1 ----------------
    | ValueError: 1
    +------------------------------------

except* 절에 의해 처리되지 않은 나머지 예외는 마지막에 다시 발생하여 except* 절 내에서 발생한 모든 예외와 함께 예외 그룹으로 결합됩니다.

발생한 예외가 예외 그룹이 아니고 해당 유형이 except* 절 중 하나와 일치하는 경우 빈 메시지 문자열이 있는 예외 그룹에 의해 포착되고 래핑됩니다.

>>> try:
...     raise BlockingIOError
... except* BlockingIOError as e:
...     print(repr(e))
... 
ExceptionGroup('', (BlockingIOError()))

except* 절에는 일치하는 유형이 있어야 하며 이 유형은 BaseExceptionGroup의 하위 클래스일 수 없습니다. 같은 시도에서 except와 except*를 함께 사용할 수 없습니다. break, continue 및 return은 except* 절에 나타날 수 없습니다.

8.4.3. else clause

선택적 else 절은 제어 흐름이 try 제품군을 벗어나고 예외가 발생하지 않았으며 return, continue 또는 break 문이 실행되지 않은 경우 실행됩니다. else 절의 예외는 앞의 except 절에서 처리되지 않습니다.

8.4.4. finally clause

finally가 있으면 ‘정리’ 처리기를 지정합니다. except 및 else 절을 포함하여 try 절이 실행됩니다. 어느 조항에서든 예외가 발생하여 처리하지 않으면 임시로 예외를 저장합니다. finally 절이 실행됩니다. 저장된 예외가 있으면 finally 절의 끝에서 다시 발생합니다. finally 절이 다른 예외를 발생시키면 저장된 예외가 새 예외의 컨텍스트로 설정됩니다. finally 절이 return, break 또는 continue 문을 실행하면 저장된 예외가 삭제됩니다.

>>> def f():
...     try:
...         1/0
...     finally:
...         return 42
... 
>>> f()
42

finally 절을 실행하는 동안 프로그램에서 예외 정보를 사용할 수 없습니다.

return, break 또는 continue 문이 try…finally 문의 try 스위트에서 실행될 때 finally 절도 ‘on the way out’에서 실행됩니다.

함수의 반환 값은 실행된 마지막 반환 문에 의해 결정됩니다. finally 절은 항상 실행되므로 finally 절에서 실행되는 return 문은 항상 마지막으로 실행됩니다.

>>> def foo():
...     try:
...         return 'try'
...     finally:
...         return 'finally'
... 
>>> foo()
'finally'

버전 3.8에서 변경: 파이썬 3.8 이전에는 구현 문제로 인해 finally 절에서 continue 문이 올바르지 않았습니다.

8.5. The with statement

with 문은 컨텍스트 관리자가 정의한 메서드로 블록 실행을 래핑하는 데 사용됩니다(With 문 컨텍스트 관리자 섹션 참조). 이를 통해 일반적인 시도…제외…최종 사용 패턴을 캡슐화하여 편리하게 재사용할 수 있습니다.

with_stmt          ::=  "with" ( "(" with_stmt_contents ","? ")" | with_stmt_contents ) ":" suite
with_stmt_contents ::=  with_item ("," with_item)*
with_item          ::=  expression ["as" target]

하나의 “항목”이 포함된 with 문의 실행은 다음과 같이 진행됩니다.

  1. 컨텍스트 표현식(with_item에 제공된 표현식)은 컨텍스트 관리자를 얻기 위해 평가됩니다.
  2. 컨텍스트 관리자의 __enter__()는 나중에 사용하기 위해 로드됩니다.
  3. 컨텍스트 관리자의 __exit__()는 나중에 사용하기 위해 로드됩니다.
  4. 컨텍스트 관리자의 __enter__() 메서드가 호출됩니다.
  5. 대상이 with 문에 포함된 경우 __enter__()의 반환 값이 대상에 할당됩니다.

    참고: with 문은 __enter__() 메서드가 오류 없이 반환되면 __exit__()가 항상 호출되도록 보장합니다. 따라서 대상 목록에 할당하는 동안 오류가 발생하면 제품군 내에서 발생하는 오류와 동일하게 처리됩니다. 아래의 7단계를 참조하십시오.
  6. 제품군이 실행됩니다.
  7. 컨텍스트 관리자의 __exit__() 메서드가 호출됩니다. 예외로 인해 제품군이 종료된 경우, 해당 유형, 값 및 트레이스백이 __exit__()의 인수로 전달됩니다. 그렇지 않으면 세 개의 None 인수가 제공됩니다.

    예외로 인해 스위트가 종료되었고 __exit__() 메서드의 반환 값이 거짓이면 예외가 다시 발생합니다. 반환 값이 true이면 예외가 억제되고 with 문 다음의 문으로 실행이 계속됩니다.

    예외가 아닌 다른 이유로 스위트가 종료된 경우 __exit__() 의 반환 값은 무시되고 종료된 종류의 정상 위치에서 실행이 진행됩니다.

다음 코드:

with EXPRESSION as TARGET:
    SUITE

의미상 다음과 동일합니다.

manager = (EXPRESSION)
enter = type(manager).__enter__
exit = type(manager).__exit__
value = enter(manager)
hit_except = False

try:
    TARGET = value
    SUITE
except:
    hit_except = True
    if not exit(manager, *sys.exc_info()):
        raise
finally:
    if not hit_except:
        exit(manager, None, None, None)

둘 이상의 항목이 있는 경우 컨텍스트 관리자는 여러 with 문이 중첩된 것처럼 처리됩니다.

with A() as a, B() as b:
    SUITE

의미상 다음과 동일합니다.

with A() as a:
    with B() as b:
        SUITE

항목이 괄호로 묶인 경우 다중 항목 컨텍스트 관리자를 여러 줄로 작성할 수도 있습니다. 예를 들어:

with (
    A() as a,
    B() as b,
):
    SUITE

버전 3.1에서 변경: 여러 컨텍스트 표현식 지원.

버전 3.10에서 변경: 그룹화 괄호를 사용하여 명령문을 여러 줄로 나누도록 지원합니다.

See also
PEP 343 – The “with” statement
Python with 문에 대한 사양, 배경 및 예제입니다.

8.6. The match statement

버전 3.10의 새로운 기능.

match 문은 패턴 일치에 사용됩니다. 통사론:

match_stmt   ::=  'match' subject_expr ":" NEWLINE INDENT case_block+ DEDENT
subject_expr ::=  star_named_expression "," star_named_expressions?
                  | named_expression
case_block   ::=  'case' patterns [guard] ":" block

Note
이 섹션에서는 작은따옴표를 사용하여 소프트 키워드를 나타냅니다.

패턴 매칭은 패턴(다음 사례)과 대상 값(다음 일치)을 입력으로 사용합니다. 패턴(하위 패턴을 포함할 수 있음)은 대상 값과 일치합니다. 결과는 다음과 같습니다.

  • 일치 성공 또는 실패(패턴 성공 또는 실패라고도 함).
  • 일치하는 값을 이름에 바인딩할 수 있습니다. 이에 대한 전제 조건은 아래에서 자세히 설명합니다.

match 및 case 키워드는 소프트 키워드입니다.

See also
PEP 634 – Structural Pattern Matching: Specification
PEP 636 – Structural Pattern Matching: Tutorial

8.6.1. Overview

다음은 일치 문의 논리적 흐름에 대한 개요입니다.

  1. 주제 표현식 subject_expr이 평가되고 결과 주제 값이 획득됩니다. 주제 표현식에 쉼표가 포함되어 있으면 표준 규칙을 사용하여 튜플이 생성됩니다.
  2. case_block의 각 패턴은 주제 값과 일치하도록 시도됩니다. 성공 또는 실패에 대한 구체적인 규칙은 아래에 설명되어 있습니다. 일치 시도는 패턴 내의 독립 실행형 이름의 일부 또는 전체를 바인딩할 수도 있습니다. 정확한 패턴 바인딩 규칙은 패턴 유형에 따라 다르며 아래에 지정되어 있습니다. 성공적인 패턴 일치 중에 만들어진 이름 바인딩은 실행된 블록보다 오래 지속되며 일치 문 뒤에 사용할 수 있습니다.
    참고: 실패한 패턴 일치 중에 일부 하위 패턴이 성공할 수 있습니다. 실패한 일치에 대한 바인딩에 의존하지 마십시오. 반대로 일치 실패 후 변경되지 않은 상태로 남아 있는 변수에 의존하지 마십시오. 정확한 동작은 구현에 따라 다르며 다를 수 있습니다. 이는 다양한 구현에서 최적화를 추가할 수 있도록 의도적으로 내린 결정입니다.
  3. 패턴이 성공하면 해당 가드(있는 경우)가 평가됩니다. 이 경우 모든 이름 바인딩이 발생한 것으로 보장됩니다.
    1. 가드가 true로 평가되거나 누락된 경우 case_block 내부의 블록이 실행됩니다.
    2. 그렇지 않으면 위에서 설명한 대로 다음 case_block이 시도됩니다.
    3. 추가 케이스 블록이 없으면 일치 문이 완료됩니다.

참고: 일반적으로 사용자는 평가 중인 패턴에 의존해서는 안 됩니다. 구현에 따라 인터프리터는 값을 캐시하거나 반복 평가를 건너뛰는 다른 최적화를 사용할 수 있습니다.

샘플 일치 문:

>>> flag = False
>>> match (100, 200):
...    case (100, 300):  # Mismatch: 200 != 300
...        print('Case 1')
...    case (100, 200) if flag:  # Successful match, but guard fails
...        print('Case 2')
...    case (100, y):  # Matches and binds y to 200
...        print(f'Case 3, y: {y}')
...    case _:  # Pattern not attempted
...        print('Case 4, I match anything!')
... 
Case 3, y: 200

이 경우 if flag는 가드입니다. 다음 섹션에서 이에 대해 자세히 알아보세요.

8.6.2. Guards

guard ::=  "if" named_expression

케이스 블록 내부의 코드가 실행되려면 가드(케이스의 일부)가 성공해야 합니다. 다음과 같은 형식을 취합니다: 표현식 뒤에 오는 경우.

가드가 있는 케이스 블록의 논리적 흐름은 다음과 같습니다.

  • 케이스 블록의 패턴이 성공했는지 확인하십시오. 패턴이 실패하면 가드가 평가되지 않고 다음 케이스 블록이 확인됩니다.
  • 패턴이 성공하면 가드를 평가하십시오.
    • 가드 조건이 참으로 평가되면 케이스 블록이 선택됩니다.
    • 가드 조건이 거짓으로 평가되면 케이스 블록이 선택되지 않습니다.
    • 가드가 평가 중에 예외를 발생시키면 예외가 발생합니다.

가드는 표현식이기 때문에 부작용이 있을 수 있습니다. 가드 평가는 패턴이 모두 성공하지 않는 경우 블록을 건너뛰고 한 번에 하나씩 첫 번째 사례 블록에서 마지막 사례 블록까지 진행해야 합니다. (즉, 가드 평가는 순서대로 이루어져야 합니다.) 가드 평가는 케이스 블록이 선택되면 중지해야 합니다.

8.6.3. Irrefutable Case Blocks

반박 불가능한 케이스 블록은 모두 일치하는 케이스 블록입니다. 일치 문에는 반박할 수 없는 사례 블록이 최대 하나 있을 수 있으며 마지막이어야 합니다.

가드가 없고 패턴이 반박 불가능한 경우 케이스 블록은 반박 불가능한 것으로 간주됩니다. 구문만으로 항상 성공할 것이라는 것을 증명할 수 있는 패턴은 반박할 수 없는 것으로 간주됩니다. 반박할 수 없는 패턴은 다음과 같습니다.

  • 왼쪽이 반박할 수 없는 AS 패턴
  • 반박할 수 없는 패턴이 하나 이상 포함된 OR 패턴
  • 캡처 패턴
  • 와일드카드 패턴
  • 반박할 수 없는 괄호 패턴

8.6.4. Patterns

Note
 이 섹션에서는 표준 EBNF 이외의 문법 표기법을 사용합니다.
표기법 SEP.RULE+는 RULE(SEP RULE)*의 줄임말입니다.
표기법 !RULE은 부정적인 예측 어설션의 줄임말입니다.

패턴의 최상위 구문은 다음과 같습니다.

patterns       ::=  open_sequence_pattern | pattern
pattern        ::=  as_pattern | or_pattern
closed_pattern ::=  | literal_pattern
                    | capture_pattern
                    | wildcard_pattern
                    | value_pattern
                    | group_pattern
                    | sequence_pattern
                    | mapping_pattern
                    | class_pattern

아래 설명에는 설명 목적으로 패턴이 수행하는 작업에 대한 “간단한 용어로” 설명이 포함됩니다(대부분의 설명에 영감을 준 문서에 대한 Raymond Hettinger의 공로). 이러한 설명은 순전히 설명을 위한 것이며 기본 구현을 반영하지 않을 수 있습니다. 또한 모든 유효한 양식을 다루지는 않습니다.

8.6.4.1. OR Patterns

OR 패턴은 세로 막대 |로 구분된 둘 이상의 패턴입니다. 통사론:

or_pattern ::=  "|".closed_pattern+

최종 하위 패턴만 반박할 수 없으며 각 하위 패턴은 모호성을 피하기 위해 동일한 이름 집합을 바인딩해야 합니다.

OR 패턴은 하나가 성공할 때까지 각 하위 패턴을 대상 값과 차례로 일치시킵니다. 그러면 OR 패턴이 성공한 것으로 간주됩니다. 그렇지 않고 성공하는 하위 패턴이 없으면 OR 패턴이 실패합니다.

간단히 말해서 P1 | P2 | … P1과 일치시키려고 시도하고, 실패하면 P2와 일치시키려고 시도합니다. 성공하면 즉시 성공하고 그렇지 않으면 실패합니다.

8.6.4.2. AS Patterns

AS 패턴은 주제에 대해 as 키워드 왼쪽의 OR 패턴과 일치합니다. 통사론:

as_pattern ::=  or_pattern "as" capture_pattern

OR 패턴이 실패하면 AS 패턴도 실패합니다. 그렇지 않으면 AS 패턴은 주제를 as 키워드 오른쪽에 있는 이름에 바인딩하고 성공합니다. capture_pattern은 _일 수 없습니다.

간단히 말해서 P as NAME은 P와 일치하고 성공하면 NAME = 로 설정됩니다.

8.6.4.3. Literal Patterns

리터럴 패턴은 파이썬에서 대부분의 리터럴에 해당합니다. 통사론:

literal_pattern ::=  signed_number
                     | signed_number "+" NUMBER
                     | signed_number "-" NUMBER
                     | strings
                     | "None"
                     | "True"
                     | "False"
                     | signed_number: NUMBER | "-" NUMBER

규칙 문자열과 토큰 NUMBER는 표준 Python 문법에 정의되어 있습니다. 삼중 인용 문자열이 지원됩니다. 원시 문자열과 바이트 문자열이 지원됩니다. 형식이 지정된 문자열 리터럴은 지원되지 않습니다.

signed_number ‘+’ NUMBER 및 signed_number ‘-‘ NUMBER 형식은 복소수를 표현하기 위한 것입니다. 왼쪽에는 실수가, 오른쪽에는 허수가 필요합니다. 예를 들어 3 + 4j.

간단히 말해서 LITERAL은 == LITERAL인 경우에만 성공합니다. 싱글톤 None, True 및 False의 경우 is 연산자가 사용됩니다.

8.6.4.4. Capture Patterns

캡처 패턴은 주체 값을 이름에 바인딩합니다. 통사론:

capture_pattern ::=  !'_' NAME

하나의 밑줄 _은 캡처 패턴이 아닙니다(이것은 !’_’가 표현하는 것입니다). 대신 wildcard_pattern으로 처리됩니다.

지정된 패턴에서 지정된 이름은 한 번만 바인딩될 수 있습니다. 예를 들어 case x, x: …는 case [x] | 동안 유효하지 않습니다. x: … 허용됩니다.

캡처 패턴은 항상 성공합니다. 바인딩은 PEP 572의 할당 표현식 연산자에 의해 설정된 범위 지정 규칙을 따릅니다. 해당 이름은 적용 가능한 전역 또는 비지역 문이 없는 한 가장 가까운 포함 함수 범위에서 지역 변수가 됩니다.

간단히 말해서 NAME은 항상 성공하며 NAME = 로 설정됩니다.

8.6.4.5. Wildcard Patterns

와일드카드 패턴은 항상 성공하고(무엇이든 일치) 이름을 바인딩하지 않습니다. 통사론:

wildcard_pattern ::=  '_'

_는 모든 패턴 내에서 소프트 키워드이지만 패턴 내에서만 가능합니다. 일치 주제 표현식, 가드 및 케이스 블록 내에서도 평소와 같이 식별자입니다.

간단히 말해서 _는 항상 성공할 것입니다.

8.6.4.6. Value Patterns

값 패턴은 Python에서 명명된 값을 나타냅니다. 통사론:

value_pattern ::=  attr
attr          ::=  name_or_attr "." NAME
name_or_attr  ::=  attr | NAME

패턴의 점으로 구분된 이름은 표준 Python 이름 확인 규칙을 사용하여 조회됩니다. 찾은 값이 대상 값과 같다고 비교하면 패턴이 성공한 것입니다(== 같음 연산자 사용).

간단히 말해서 NAME1.NAME2는 == NAME1.NAME2인 경우에만 성공합니다.

참고: 동일한 일치 문에서 동일한 값이 여러 번 발생하는 경우 인터프리터는 찾은 첫 번째 값을 캐시하고 동일한 조회를 반복하는 대신 재사용할 수 있습니다. 이 캐시는 지정된 일치 문의 지정된 실행과 엄격하게 연결되어 있습니다.

8.6.4.7. Group Patterns

그룹 패턴을 사용하면 패턴 주위에 괄호를 추가하여 의도한 그룹화를 강조할 수 있습니다. 그렇지 않으면 추가 구문이 없습니다. 통사론:

group_pattern ::=  "(" pattern ")"

간단히 말해서 (P)는 P와 같은 효과를 가집니다.

8.6.4.8. Sequence Patterns

시퀀스 패턴에는 시퀀스 요소와 일치시킬 여러 하위 패턴이 포함되어 있습니다. 구문은 목록 또는 튜플의 압축을 푸는 것과 비슷합니다.

sequence_pattern       ::=  "[" [maybe_sequence_pattern] "]"
                            | "(" [open_sequence_pattern] ")"
open_sequence_pattern  ::=  maybe_star_pattern "," [maybe_sequence_pattern]
maybe_sequence_pattern ::=  ",".maybe_star_pattern+ ","?
maybe_star_pattern     ::=  star_pattern | pattern
star_pattern           ::=  "*" (capture_pattern | wildcard_pattern)

시퀀스 패턴(즉, (…) 대 […] )에 괄호나 대괄호를 사용하는 경우에는 차이가 없습니다.

참고: 후행 쉼표 없이 괄호로 묶인 단일 패턴(예: (3 | 4))은 그룹 패턴입니다. 대괄호로 묶인 단일 패턴(예: [3 | 4])은 여전히 시퀀스 패턴입니다.

최대 하나의 스타 하위 패턴이 시퀀스 패턴에 있을 수 있습니다. 별 모양의 하위 패턴은 어느 위치에서나 나타날 수 있습니다. 스타 하위 패턴이 없으면 시퀀스 패턴은 고정 길이 시퀀스 패턴입니다. 그렇지 않으면 가변 길이 시퀀스 패턴입니다.

다음은 주제 값에 대해 시퀀스 패턴을 일치시키는 논리적 흐름입니다.

  1. 대상 값이 시퀀스 2가 아니면 시퀀스 패턴이 실패합니다.
  2. 대상 값이 str, bytes 또는 bytearray의 인스턴스인 경우 시퀀스 패턴이 실패합니다.
  3. 후속 단계는 시퀀스 패턴이 고정 길이인지 가변 길이인지에 따라 다릅니다.
    1. 시퀀스 패턴이 고정 길이인 경우:
      1. 대상 시퀀스의 길이가 서브 패턴의 수와 같지 않으면 시퀀스 패턴이 실패합니다.
      2. 시퀀스 패턴의 하위 패턴은 왼쪽에서 오른쪽으로 대상 시퀀스의 해당 항목과 일치합니다. 하위 패턴이 실패하는 즉시 매칭이 중지됩니다. 모든 하위 패턴이 해당 항목 일치에 성공하면 시퀀스 패턴이 성공합니다.
    2. 그렇지 않고 시퀀스 패턴이 가변 길이인 경우:
      1. 대상 시퀀스의 길이가 별이 아닌 하위 패턴의 수보다 작으면 시퀀스 패턴이 실패합니다.
      2. 고정 길이 시퀀스의 경우 선행 비스타 하위 패턴은 해당 항목과 일치합니다.
      3. 이전 단계가 성공하면 별 하위 패턴은 별 하위 패턴 다음에 오는 비별 하위 패턴에 해당하는 나머지 항목을 제외하고 나머지 주제 항목으로 구성된 목록과 일치합니다.
      4. 나머지 비별 하위 패턴은 고정 길이 시퀀스와 마찬가지로 해당 주제 항목과 일치합니다.

참고: 대상 시퀀스의 길이는 len()을 통해(즉, __len__() 프로토콜을 통해) 얻습니다. 이 길이는 값 패턴과 유사한 방식으로 인터프리터에 의해 캐시될 수 있습니다.

간단히 말해서 [P1, P2, P3, … , P]은 다음과 같은 경우에만 일치합니다.

  •  <subject> 이 시퀀스인지 확인하십시오.
  • len(subject) == <N>
  • P1은 <subject>[0]과 일치합니다(이 일치는 이름을 바인딩할 수도 있음).
  • P2는 <subject>[1]과 일치합니다(이 일치는 이름을 바인딩할 수도 있음).
  • … 그리고 해당 패턴/요소에 대해 등등.

8.6.4.9. Mapping Patterns

매핑 패턴에는 하나 이상의 키-값 패턴이 포함됩니다. 구문은 사전 구성과 유사합니다. 통사론:

mapping_pattern     ::=  "{" [items_pattern] "}"
items_pattern       ::=  ",".key_value_pattern+ ","?
key_value_pattern   ::=  (literal_pattern | value_pattern) ":" pattern
                         | double_star_pattern
double_star_pattern ::=  "**" capture_pattern

최대 하나의 이중 별 패턴이 매핑 패턴에 있을 수 있습니다. 이중 별 패턴은 매핑 패턴의 마지막 하위 패턴이어야 합니다.

매핑 패턴의 중복 키는 허용되지 않습니다. 중복 리터럴 키는 SyntaxError를 발생시킵니다. 그렇지 않으면 동일한 값을 갖는 두 개의 키가 런타임에 ValueError를 발생시킵니다.

다음은 주체 값에 대해 매핑 패턴을 일치시키는 논리적 흐름입니다.

  1. 대상 값이 매핑 3이 아닌 경우 매핑 패턴이 실패합니다.
  2. 매핑 패턴에 주어진 모든 키가 주체 매핑에 존재하고 각 키의 패턴이 주체 매핑의 해당 항목과 일치하면 매핑 패턴이 성공합니다.
  3. 매핑 패턴에서 중복 키가 감지되면 패턴이 잘못된 것으로 간주됩니다. 중복 리터럴 값에 대해 SyntaxError 가 발생합니다; 또는 동일한 값의 명명된 키에 대한 ValueError입니다.

참고: 키-값 쌍은 매핑 주체의 get() 메서드의 두 인수 형식을 사용하여 일치합니다. 일치하는 키-값 쌍은 매핑에 이미 존재해야 하며 __missing__() 또는 __getitem__()을 통해 즉석에서 생성되지 않아야 합니다.

간단히 말해서 {KEY1: P1, KEY2: P2, … }는 다음이 모두 발생하는 경우에만 일치합니다.

  •  <subject>이 매핑인지 확인
  • KEY1 in <subject>
  • P1은 <subject>[KEY1]과 일치합니다.
  • … 그리고 해당 키/패턴 쌍에 대해 등등.

8.6.4.10. Class Patterns

클래스 패턴은 클래스와 해당 위치 및 키워드 인수(있는 경우)를 나타냅니다. 통사론:

class_pattern       ::=  name_or_attr "(" [pattern_arguments ","?] ")"
pattern_arguments   ::=  positional_patterns ["," keyword_patterns]
                         | keyword_patterns
positional_patterns ::=  ",".pattern+
keyword_patterns    ::=  ",".keyword_pattern+
keyword_pattern     ::=  NAME "=" pattern

동일한 키워드가 클래스 패턴에서 반복되어서는 안 됩니다.

다음은 주제 값에 대해 클래스 패턴을 일치시키는 논리적 흐름입니다.

  1. name_or_attr이 내장 type의 인스턴스가 아니면 TypeError를 발생시킵니다.
  2. 대상 값이 name_or_attr(isinstance()를 통해 테스트됨)의 인스턴스가 아니면 클래스 패턴이 실패합니다.
  3. 패턴 인수가 없으면 패턴이 성공합니다. 그렇지 않으면 후속 단계는 키워드 또는 위치 인수 패턴이 있는지 여부에 따라 달라집니다.
    여러 기본 제공 유형(아래에 지정됨)의 경우 전체 주제와 일치하는 단일 위치 하위 패턴이 허용됩니다. 이러한 유형의 키워드 패턴은 다른 유형과 마찬가지로 작동합니다.
    1. 키워드 패턴만 있는 경우 다음과 같이 하나씩 처리됩니다.
      1. 키워드는 주제에 대한 속성으로 조회됩니다.
        1. 이로 인해 AttributeError 이외의 예외가 발생하면 예외가 발생합니다.
        2. 이로 인해 AttributeError가 발생하면 클래스 패턴이 실패한 것입니다.
        3. 그렇지 않으면 키워드 패턴과 관련된 하위 패턴이 주제의 속성 값과 일치합니다. 이것이 실패하면 클래스 패턴이 실패합니다. 이것이 성공하면 일치가 다음 키워드로 진행됩니다.
      2. 모든 키워드 패턴이 성공하면 클래스 패턴이 성공합니다.
    2. 위치 패턴이 있으면 일치하기 전에 name_or_attr 클래스의 __match_args__ 속성을 사용하여 키워드 패턴으로 변환됩니다.
      1. getattr(cls, “__match_args__”, ()) 와 동등한 것이 호출됩니다.
        1. 이로 인해 예외가 발생하면 예외가 발생합니다.
        2. 반환된 값이 튜플이 아니면 변환이 실패하고 TypeError가 발생합니다.
        3. len(cls.__match_args__)보다 더 많은 위치 패턴이 있으면 TypeError가 발생합니다.
        4. 그렇지 않으면 위치 패턴 i가 __match_args__[i]를 키워드로 사용하여 키워드 패턴으로 변환됩니다. __match_args__[i]는 문자열이어야 합니다. 그렇지 않으면 TypeError가 발생합니다.
        5. 중복 키워드가 있으면 TypeError가 발생합니다.
        6. 클래스 패턴 일치에서 위치 인수 사용자 정의도 참조하십시오.
      2. 모든 위치 패턴이 키워드 패턴으로 변환되면, 키워드 패턴만 있는 것처럼 일치가 진행됩니다.
    3. 다음 내장 유형의 경우 위치 하위 패턴 처리가 다릅니다.
      1. bool
      2. bytearray
      3. bytes
      4. dict
      5. float
      6. frozenset
      7. int
      8. list
      9. set
      10. str
      11. tuple
    4. 이러한 클래스는 단일 위치 인수를 허용하고 거기에 있는 패턴은 특성이 아닌 전체 개체와 일치합니다. 예를 들어 int(0|1)은 값 0과 일치하지만 값 0.0과는 일치하지 않습니다.

간단히 말해서 CLS(P1, attr=P2)는 다음과 같은 경우에만 일치합니다.

  • isinstance(<제목>, CLS)
  • CLS.__match_args__를 사용하여 P1을 키워드 패턴으로 변환
  • 각 키워드 인수 attr=P2에 대해:
  • hasattr(<제목>, “attr”)
  • P2는 <제목>.attr과 일치합니다.
  • … 해당 키워드 인수/패턴 쌍에 대해 등등.

See also
PEP 634 – Structural Pattern Matching: Specification
PEP 636 – Structural Pattern Matching: Tutorial

8.7. Function definitions

함수 정의는 사용자 정의 함수 개체를 정의합니다(표준 유형 계층 섹션 참조).

funcdef                   ::=  [decorators] "def" funcname "(" [parameter_list] ")"
                               ["->" expression] ":" suite
decorators                ::=  decorator+
decorator                 ::=  "@" assignment_expression NEWLINE
parameter_list            ::=  defparameter ("," defparameter)* "," "/" ["," [parameter_list_no_posonly]]
                                 | parameter_list_no_posonly
parameter_list_no_posonly ::=  defparameter ("," defparameter)* ["," [parameter_list_starargs]]
                               | parameter_list_starargs
parameter_list_starargs   ::=  "*" [parameter] ("," defparameter)* ["," ["**" parameter [","]]]
                               | "**" parameter [","]
parameter                 ::=  identifier [":" expression]
defparameter              ::=  parameter ["=" expression]
funcname                  ::=  identifier

함수 정의는 실행 가능한 명령문입니다. 해당 실행은 현재 로컬 네임스페이스의 함수 이름을 함수 개체(함수에 대한 실행 코드 주위의 래퍼)에 바인딩합니다. 이 함수 개체에는 함수가 호출될 때 사용될 전역 네임스페이스로 현재 전역 네임스페이스에 대한 참조가 포함되어 있습니다.

함수 정의는 함수 본문을 실행하지 않습니다. 이것은 함수가 호출될 때만 실행됩니다.

함수 정의는 하나 이상의 데코레이터 표현식으로 래핑될 수 있습니다. 데코레이터 식은 함수 정의가 포함된 범위에서 함수가 정의될 때 평가됩니다. 결과는 함수 개체를 유일한 인수로 사용하여 호출되는 콜러블이어야 합니다. 반환된 값은 함수 개체 대신 함수 이름에 바인딩됩니다. 여러 데코레이터가 중첩 방식으로 적용됩니다. 예를 들어, 다음 코드

@f1(arg)
@f2
def func(): pass

는 대략 다음과 같습니다.

def func(): pass
func = f1(arg)(f2(func))

원래 함수가 일시적으로 func라는 이름에 바인딩되지 않는다는 점만 다릅니다.

버전 3.9에서 변경: 함수는 유효한 assignment_expression으로 장식될 수 있습니다. 이전에는 문법이 훨씬 더 제한적이었습니다. 자세한 내용은 PEP 614를 참조하십시오.

하나 이상의 매개변수가 매개변수 = 표현식 형식이면 함수에 “기본 매개변수 값”이 있다고 합니다. 기본값이 있는 매개변수의 경우 호출에서 해당 인수를 생략할 수 있으며 이 경우 매개변수의 기본값이 대체됩니다. 매개변수에 기본값이 있는 경우 “*”까지 이어지는 모든 매개변수에도 기본값이 있어야 합니다. 이는 문법으로 표현되지 않는 구문 제한입니다.

기본 매개변수 값은 함수 정의가 실행될 때 왼쪽에서 오른쪽으로 평가됩니다. 이는 함수가 정의될 때 표현식이 한 번 평가되고 동일한 “사전 계산된” 값이 각 호출에 사용됨을 의미합니다. 이는 기본 매개변수 값이 목록이나 사전과 같은 가변 객체일 때 이해하는 데 특히 중요합니다. 함수가 객체를 수정하면(예: 목록에 항목 추가) 기본 매개변수 값이 사실상 수정됩니다. 이것은 일반적으로 의도한 바가 아닙니다. 이 문제를 해결하는 방법은 None을 기본값으로 사용하고 함수 본문에서 이를 명시적으로 테스트하는 것입니다. 예를 들면 다음과 같습니다.

def whats_on_the_telly(penguin=None):
    if penguin is None:
        penguin = []
    penguin.append("property of the zoo")
    return penguin

함수 호출 의미 체계는 호출 섹션에서 자세히 설명합니다. 함수 호출은 항상 위치 인수, 키워드 인수 또는 기본값에서 매개변수 목록에 언급된 모든 매개변수에 값을 할당합니다. “*identifier” 형식이 있으면 초과 위치 매개변수를 수신하는 튜플로 초기화되며 기본값은 빈 튜플입니다. “**식별자” 형식이 있는 경우 초과 키워드 인수를 수신하는 새로운 정렬 매핑으로 초기화되며, 기본값은 동일한 유형의 새로운 빈 매핑입니다. “*” 또는 “*identifier” 뒤의 매개변수는 키워드 전용 매개변수이며 키워드 인수로만 전달될 수 있습니다. “/” 앞의 매개변수는 위치 전용 매개변수이며 위치 인수로만 전달될 수 있습니다.

버전 3.8에서 변경: / 함수 매개변수 구문은 위치 전용 매개변수를 나타내는 데 사용될 수 있습니다. 자세한 내용은 PEP 570을 참조하십시오.

매개변수에는 매개변수 이름 다음에 “:식” 형식의 주석이 있을 수 있습니다. 모든 매개변수에는 *식별자 또는 **식별자 형식의 주석을 포함하여 주석이 있을 수 있습니다. 함수는 매개변수 목록 뒤에 “-> 표현식” 형식의 “return” 주석이 있을 수 있습니다. 이러한 주석은 유효한 Python 표현식일 수 있습니다. 주석의 존재는 함수의 의미 체계를 변경하지 않습니다. 주석 값은 함수 객체의 __annotations__ 속성에 있는 매개변수 이름으로 키가 지정된 사전의 값으로 사용할 수 있습니다. __future__에서 주석 가져오기를 사용하는 경우 주석은 연기된 평가를 가능하게 하는 런타임 시 문자열로 보존됩니다. 그렇지 않으면 함수 정의가 실행될 때 평가됩니다. 이 경우 주석은 소스 코드에 나타나는 것과 다른 순서로 평가될 수 있습니다.

식에서 즉시 사용하기 위해 익명 함수(이름에 바인딩되지 않은 함수)를 만드는 것도 가능합니다. 이는 람다 섹션에 설명된 람다 식을 사용합니다. 람다 식은 단순한 함수 정의의 약칭일 뿐입니다. “def” 문에 정의된 함수는 람다 식으로 정의된 함수처럼 전달되거나 다른 이름에 할당될 수 있습니다. “def” 형식은 여러 문과 주석을 실행할 수 있기 때문에 실제로 더 강력합니다.

프로그래머 메모: 함수는 일급 개체입니다. 함수 정의 내에서 실행되는 “def” 문은 반환되거나 전달될 수 있는 로컬 함수를 정의합니다. 중첩 함수에 사용되는 자유 변수는 def를 포함하는 함수의 로컬 변수에 액세스할 수 있습니다. 자세한 내용은 이름 지정 및 바인딩 섹션을 참조하십시오.

See also
PEP 3107 – Function Annotations
함수 주석의 원래 사양입니다.
PEP 484 – Type Hints
주석의 표준 의미 정의: 유형 힌트.
PEP 526 – Syntax for Variable Annotations
클래스 변수 및 인스턴스 변수를 포함한 힌트 변수 선언을 입력하는 기능
PEP 563 – Postponed Evaluation of Annotations
즉시 평가하는 대신 런타임에 주석을 문자열 형식으로 유지하여 주석 내 전방 참조를 지원합니다.

8.8. Class definitions

클래스 정의는 클래스 객체를 정의합니다(표준 유형 계층 섹션 참조).

classdef    ::=  [decorators] "class" classname [inheritance] ":" suite
inheritance ::=  "(" [argument_list] ")"
classname   ::=  identifier

클래스 정의는 실행 가능한 문입니다. 상속 목록은 일반적으로 기본 클래스 목록을 제공하므로(고급 사용에 대해서는 메타클래스 참조) 목록의 각 항목은 서브클래싱을 허용하는 클래스 개체로 평가되어야 합니다. 상속 목록이 없는 클래스는 기본적으로 기본 클래스 개체에서 상속됩니다. 따라서, 아래 코드는

class Foo:
    pass

아래코드와 동일하게 취급됩니다.

class Foo(object):
    pass

그런 다음 클래스 제품군은 새로 생성된 로컬 네임스페이스와 원래 전역 네임스페이스를 사용하여 새 실행 프레임(네이밍 및 바인딩 참조)에서 실행됩니다. (일반적으로 스위트에는 대부분 함수 정의가 포함되어 있습니다.) 클래스의 스위트가 실행을 마치면 실행 프레임은 폐기되지만 로컬 네임스페이스는 저장됩니다. 5 그러면 기본 클래스의 상속 목록과 속성 사전의 저장된 로컬 네임스페이스를 사용하여 클래스 객체가 생성됩니다. 클래스 이름은 원래 로컬 네임스페이스의 이 클래스 개체에 바인딩됩니다.

속성이 클래스 본문에 정의된 순서는 새 클래스의 __dict__에서 유지됩니다. 이것은 클래스가 생성된 직후에만 그리고 정의 구문을 사용하여 정의된 클래스에 대해서만 신뢰할 수 있습니다.

클래스 생성은 메타클래스를 사용하여 크게 사용자 지정할 수 있습니다.

클래스도 꾸밀 수 있습니다: 함수를 꾸밀 때처럼,

@f1(arg)
@f2
class Foo: pass

는 대략 다음과 같습니다.

class Foo: pass
Foo = f1(arg)(f2(Foo))

데코레이터 표현식의 평가 규칙은 함수 데코레이터와 동일합니다. 그런 다음 결과는 클래스 이름에 바인딩됩니다.

버전 3.9에서 변경: 클래스는 유효한 assignment_expression으로 장식될 수 있습니다. 이전에는 문법이 훨씬 더 제한적이었습니다. 자세한 내용은 PEP 614를 참조하십시오.

프로그래머 참고 사항: 클래스 정의에 정의된 변수는 클래스 속성입니다. 인스턴스에서 공유됩니다. 인스턴스 속성은 self.name = value인 메소드에서 설정할 수 있습니다. 클래스 속성과 인스턴스 속성 모두 “self.name” 표기법을 통해 액세스할 수 있으며 인스턴스 속성은 이러한 방식으로 액세스할 때 동일한 이름을 가진 클래스 속성을 숨깁니다. 클래스 속성은 인스턴스 속성의 기본값으로 사용할 수 있지만 변경 가능한 값을 사용하면 예기치 않은 결과가 발생할 수 있습니다. 디스크립터를 사용하여 구현 세부 정보가 다른 인스턴스 변수를 만들 수 있습니다.

See also
PEP 3115 – Metaclasses in Python 3000
메타클래스의 선언을 현재 구문으로 변경한 제안 및 메타클래스가 있는 클래스가 구성되는 방법에 대한 의미 체계.
PEP 3129 – Class Decorators
클래스 데코레이터를 추가한 제안. 함수 및 메서드 데코레이터는 PEP 318에 도입되었습니다.

8.9. Coroutines

버전 3.5의 새로운 기능.

8.9.1. Coroutine function definition

async_funcdef ::=  [decorators] "async" "def" funcname "(" [parameter_list] ")"
                   ["->" expression] ":" suite

Python 코루틴의 실행은 여러 지점에서 일시 중지 및 재개될 수 있습니다(코루틴 참조). await 식, async for 및 async with는 코루틴 함수의 본문에서만 사용할 수 있습니다.

async def 구문으로 정의된 함수는 await 또는 async 키워드를 포함하지 않더라도 항상 코루틴 함수입니다.

코루틴 함수 본문 내에서 표현식에서 yield를 사용하는 것은 SyntaxError입니다.

코루틴 함수의 예:

async def func(param1, param2):
    do_stuff()
    await some_coroutine()

버전 3.7에서 변경: await 및 async는 이제 키워드입니다. 이전에는 코루틴 함수의 본문 내에서만 그렇게 취급되었습니다.

8.9.2. The async for statement

async_for_stmt ::=  "async" for_stmt

비동기 이터러블은 __anext__ 메서드에서 비동기 코드를 호출할 수 있는 비동기 이터레이터를 직접 반환하는 __aiter__ 메서드를 제공합니다.

async for 문은 비동기 iterable에 대한 편리한 반복을 허용합니다.

다음 코드:

async for TARGET in ITER:
    SUITE
else:
    SUITE2

의미상 다음과 동일합니다.

iter = (ITER)
iter = type(iter).__aiter__(iter)
running = True

while running:
    try:
        TARGET = await type(iter).__anext__(iter)
    except StopAsyncIteration:
        running = False
    else:
        SUITE
else:
    SUITE2

자세한 내용은 __aiter__() 및 __anext__() 도 참조하십시오.

코루틴 함수 본문 외부에서 async for 문을 사용하는 것은 SyntaxError입니다.

8.9.3. The async with statement

async_with_stmt ::=  "async" with_stmt

비동기 컨텍스트 관리자는 enter 및 exit 메서드에서 실행을 일시 중단할 수 있는 컨텍스트 관리자입니다.

다음 코드:

async with EXPRESSION as TARGET:
    SUITE

의미상 다음과 동일합니다.

manager = (EXPRESSION)
aenter = type(manager).__aenter__
aexit = type(manager).__aexit__
value = await aenter(manager)
hit_except = False

try:
    TARGET = value
    SUITE
except:
    hit_except = True
    if not await aexit(manager, *sys.exc_info()):
        raise
finally:
    if not hit_except:
        await aexit(manager, None, None, None)

자세한 내용은 __aenter__()__aexit__() 도 참조하십시오.

코루틴 함수 본문 외부에서 async with 문을 사용하는 것은 SyntaxError입니다.

See also
PEP 492 – async 및 await 구문이 있는 코루틴
코루틴을 Python에서 적절한 독립형 개념으로 만들고 지원 구문을 추가한 제안.

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

Python Language Reference > 7. Simple statements

간단한 문장은 하나의 논리적 라인으로 구성됩니다. 세미콜론으로 구분된 한 줄에 여러 개의 간단한 문이 나타날 수 있습니다. 간단한 문의 구문은 다음과 같습니다.

simple_stmt ::=  expression_stmt
                 | assert_stmt
                 | assignment_stmt
                 | augmented_assignment_stmt
                 | annotated_assignment_stmt
                 | pass_stmt
                 | del_stmt
                 | return_stmt
                 | yield_stmt
                 | raise_stmt
                 | break_stmt
                 | continue_stmt
                 | import_stmt
                 | future_stmt
                 | global_stmt
                 | nonlocal_stmt

7.1. Expression statements

표현식 문은 (대부분 대화식으로) 값을 계산하고 쓰거나 (보통) 프로시저(의미 있는 결과를 반환하지 않는 함수, Python에서 프로시저는 None 값을 반환함)를 호출하는 데 사용됩니다. 식 문의 다른 사용이 허용되며 때때로 유용합니다. 표현식 문의 구문은 다음과 같습니다.

expression_stmt ::=  starred_expression

식 문은 식 목록(단일 식일 수 있음)을 평가합니다.

대화형 모드에서 값이 None이 아니면 내장된 repr() 함수를 사용하여 문자열로 변환되고 결과 문자열은 한 줄에 표준 출력에 자체적으로 기록됩니다(결과가 None인 경우 제외). 프로시저 호출은 출력을 발생시키지 않습니다.)

7.2. Assignment statements

대입문은 이름을 값에 (재)바인딩하고 가변 객체의 속성 또는 항목을 수정하는 데 사용됩니다.

assignment_stmt ::=  (target_list "=")+ (starred_expression | yield_expression)
target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" [target_list] ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target

(attributeref, subscription 및 slicing에 대한 구문 정의는 Primary 섹션을 참조하십시오.)

대입문은 식 목록을 평가하고(단일 식 또는 쉼표로 구분된 목록일 수 있으며 후자는 튜플을 산출함) 단일 결과 개체를 각 대상 목록에 왼쪽에서 오른쪽으로 할당합니다.

할당은 대상(목록)의 형식에 따라 재귀적으로 정의됩니다. 대상이 가변 객체(속성 참조, 구독 또는 슬라이싱)의 일부인 경우 가변 객체는 궁극적으로 할당을 수행하고 유효성을 결정해야 하며 할당이 허용되지 않는 경우 예외를 발생시킬 수 있습니다. 다양한 유형에서 관찰되는 규칙과 발생하는 예외는 개체 유형의 정의와 함께 제공됩니다(표준 유형 계층 섹션 참조).

선택적으로 괄호나 대괄호로 묶인 대상 목록에 객체 할당은 다음과 같이 재귀적으로 정의됩니다.

  • 만약 대상 목록이 선택적으로 괄호 안에 후행 쉼표가 없는 단일 대상인 경우 개체가 해당 대상에 할당됩니다.
  • 아니면:
    • 만약 대상 목록에 “별표 표시된” 대상이라고 하는 별표 접두사가 붙은 하나의 대상이 포함된 경우: 대상 목록에 있는 대상에서 1을 뺀 항목 수 이상을 포함하는 반복 가능 객체여야 합니다. iterable의 첫 번째 항목은 왼쪽에서 오른쪽으로 별표 표시된 대상 앞의 대상에 할당됩니다. iterable의 최종 항목은 별표 표시된 대상 뒤의 대상에 할당됩니다. iterable의 나머지 항목 목록은 별표 표시된 대상에 할당됩니다(목록은 비어 있을 수 있음).
    • 아니면: 객체는 대상 목록에 있는 대상과 동일한 수의 항목이 있는 반복 가능해야 하며 항목은 왼쪽에서 오른쪽으로 해당 대상에 할당됩니다.

객체를 단일 대상에 할당하는 것은 다음과 같이 재귀적으로 정의됩니다.

  • 대상이 식별자(이름)인 경우:
    • 이름이 현재 코드 블록의 전역 또는 비로컬 문에서 발생하지 않는 경우: 이름은 현재 로컬 네임스페이스의 개체에 바인딩됩니다.
    • 그렇지 않은 경우:
      이름은 각각 전역 네임스페이스 또는 nonlocal에 의해 결정된 외부 네임스페이스의 객체에 바인딩됩니다.
    • 이미 바인드된 경우 이름이 리바인드됩니다. 이로 인해 이전에 이름에 바인딩된 개체의 참조 횟수가 0에 도달하여 개체의 할당이 취소되고 소멸자(있는 경우)가 호출될 수 있습니다.
  • 대상이 속성 참조인 경우:
    • 조의 기본 표현식이 평가됩니다. 할당 가능한 속성이 있는 개체를 생성해야 합니다. 그렇지 않은 경우 TypeError가 발생합니다. 그런 다음 해당 개체는 지정된 속성에 할당된 개체를 할당하도록 요청받습니다. 할당을 수행할 수 없으면 예외가 발생합니다(반드시 그런 것은 아니지만 일반적으로 AttributeError).
    • 참고: 개체가 클래스 인스턴스이고 속성 참조가 할당 연산자의 양쪽에서 발생하는 경우 오른쪽 표현식인 a.x는 인스턴스 속성 또는 (인스턴스 속성이 없는 경우) 클래스 속성에 액세스할 수 있습니다. 왼쪽 대상 a.x는 항상 인스턴스 속성으로 설정되며 필요한 경우 생성됩니다. 따라서 a.x의 두 항목이 반드시 동일한 속성을 참조하는 것은 아닙니다. 오른쪽 표현식이 클래스 속성을 참조하는 경우 왼쪽 표현식은 할당 대상으로 새 인스턴스 속성을 만듭니다.
    • 이 설명은 property()로 생성된 속성과 같은 설명자 속성에 반드시 적용되는 것은 아닙니다.
class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
  • 대상이 구독인 경우:
    • 참조의 기본 표현식이 평가됩니다. 변경 가능한 시퀀스 개체(예: 목록) 또는 매핑 개체(예: 사전)를 생성해야 합니다. 다음으로 첨자 표현식이 평가됩니다.
    • 기본이 변경 가능한 시퀀스 개체(예: 목록)인 경우 아래 첨자는 정수를 생성해야 합니다. 음수이면 시퀀스의 길이가 추가됩니다. 결과 값은 시퀀스의 길이보다 작은 음이 아닌 정수여야 하며 시퀀스는 할당된 개체를 해당 인덱스가 있는 항목에 할당하도록 요청합니다. 인덱스가 범위를 벗어나면 IndexError가 발생합니다(아래 첨자 시퀀스에 대한 할당은 목록에 새 항목을 추가할 수 없음).
    • 기본이 매핑 객체(예: 사전)인 경우 첨자는 매핑의 키 유형과 호환되는 유형을 가져야 하며 매핑은 첨자를 할당된 객체에 매핑하는 키/데이텀 쌍을 생성하도록 요청합니다. 이렇게 하면 기존 키/값 쌍을 동일한 키 값으로 바꾸거나 새 키/값 쌍을 삽입할 수 있습니다(동일한 값을 가진 키가 없는 경우).
    • 사용자 정의 객체의 경우 __setitem__() 메서드가 적절한 인수와 함께 호출됩니다.
  • 대상이 슬라이싱인 경우:
    • 참조의 기본 표현식이 평가됩니다. 변경 가능한 시퀀스 개체(예: 목록)를 생성해야 합니다. 할당된 개체는 동일한 유형의 시퀀스 개체여야 합니다. 다음으로 하한 및 상한 식이 존재하는 한 평가됩니다. 기본값은 0이고 시퀀스의 길이입니다. 범위는 정수로 평가되어야 합니다. 경계가 음수이면 시퀀스의 길이가 추가됩니다. 결과 범위는 0과 시퀀스 길이(포함) 사이에 놓이도록 잘립니다. 마지막으로 시퀀스 객체는 슬라이스를 할당된 시퀀스의 항목으로 교체하도록 요청받습니다. 슬라이스의 길이는 할당된 시퀀스의 길이와 다를 수 있으므로 대상 시퀀스가 허용하는 경우 대상 시퀀스의 길이를 변경할 수 있습니다.

CPython 구현 세부 정보: 현재 구현에서 대상 구문은 표현식과 동일하게 간주되며 코드 생성 단계에서 잘못된 구문이 거부되어 덜 자세한 오류 메시지가 발생합니다.

할당의 정의는 왼쪽과 오른쪽 간의 겹침이 ‘동시'(예: a, b = b, a가 두 변수를 교환함)임을 암시하지만 할당된 변수 컬렉션 내에서 겹침은 왼쪽에서 발생합니다. -to-right, 때때로 혼란을 초래합니다. 예를 들어 다음 프로그램은 [0, 2]를 인쇄합니다.

x = [0, 1]
i = 0
i, x[i] = 1, 2         # i is updated, then x[i] is updated
print(x)

See also:

PEP 3132 – 확장된 반복 가능한 압축 풀기
*대상 기능에 대한 사양.

7.2.1. Augmented assignment statements

증강 할당은 단일 명령문에서 이진 연산과 대입문의 조합입니다.

augmented_assignment_stmt ::=  augtarget augop (expression_list | yield_expression)
augtarget                 ::=  identifier | attributeref | subscription | slicing
augop                     ::=  "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="
                               | ">>=" | "<<=" | "&=" | "^=" | "|="

(마지막 세 기호의 구문 정의에 대해서는 기본 항목 섹션을 참조하십시오.)

증분 할당은 대상(일반 할당문과 달리 압축 해제일 수 없음)과 표현식 목록을 평가하고 두 피연산자에 대한 할당 유형에 특정한 이진 연산을 수행하고 결과를 원래 대상에 할당합니다. 대상은 한 번만 평가됩니다.

x += 1과 같은 증분 대입식을 x = x + 1로 다시 작성하면 비슷하지만 정확히 같은 효과는 아닙니다. 증강 버전에서 x는 한 번만 평가됩니다. 또한 가능한 경우 실제 작업이 제자리에서 수행됩니다. 즉, 새 개체를 만들어 대상에 할당하는 대신 이전 개체가 수정됩니다.

일반 할당과 달리 확장 할당은 오른쪽을 평가하기 전에 왼쪽을 평가합니다. 예를 들어, a[i] += f(x)는 먼저 a[i]를 조회한 다음 f(x)를 평가하고 더하기를 수행하고 마지막으로 결과를 다시 a[i]에 씁니다.

단일 문에서 튜플 및 여러 대상에 할당하는 것을 제외하고 확장된 할당 문에 의해 수행되는 할당은 일반 할당과 동일한 방식으로 처리됩니다. 마찬가지로 가능한 내부 동작을 제외하고 증가 할당에 의해 수행되는 이진 연산은 일반 이진 연산과 동일합니다.

속성 참조인 대상의 경우 클래스 및 인스턴스 속성에 대한 주의 사항이 일반 할당과 동일하게 적용됩니다.

7.2.2. Annotated assignment statements

주석 지정은 단일 명령문에서 변수 또는 속성 주석과 선택적 지정 명령문의 조합입니다.

annotated_assignment_stmt ::=  augtarget ":" expression
                               ["=" (starred_expression | yield_expression)]

일반 할당 문과 다른 점은 단일 대상만 허용된다는 것입니다.

단순 이름을 할당 대상으로 사용하는 경우 클래스 또는 모듈 범위에 있는 경우 주석이 평가되고 변수 이름(비공개인 경우 변환됨)에서 평가된 주석으로의 사전 매핑인 특수 클래스 또는 모듈 속성 __annotations__에 저장됩니다. 이 속성은 쓰기 가능하며 주석이 정적으로 발견된 경우 클래스 또는 모듈 본문 실행 시작 시 자동으로 생성됩니다.

지정 대상인 식의 경우 클래스 또는 모듈 범위에 있는 경우 주석이 평가되지만 저장되지는 않습니다.

함수 범위에서 이름에 주석이 달린 경우 이 이름은 해당 범위에 대해 로컬입니다. 주석은 평가되지 않고 함수 범위에 저장되지 않습니다.

오른쪽이 있는 경우 주석 할당은 주석을 평가하기 전에 실제 할당을 수행합니다(해당되는 경우). 표현식 대상에 대한 오른쪽이 없으면 인터프리터는 마지막 __setitem__() 또는 __setattr__() 호출을 제외하고 대상을 평가합니다.

See also
PEP 526 – 변수 주석 구문
변수(클래스 변수 및 인스턴스 변수 포함)의 유형을 주석으로 표현하는 대신 주석을 추가하는 구문을 추가한 제안.
PEP 484 – 힌트 입력
정적 분석 도구 및 IDE에서 사용할 수 있는 유형 주석에 대한 표준 구문을 제공하기 위해 타이핑 모듈을 추가한 제안.

버전 3.8에서 변경: 이제 주석 할당은 오른쪽에 일반 할당과 동일한 표현식을 허용합니다. 이전에는 괄호로 묶지 않은 튜플 식과 같은 일부 식에서 구문 오류가 발생했습니다.

7.3. The assert statement

Assert 문은 디버깅 어설션을 프로그램에 삽입하는 편리한 방법입니다.

assert_stmt ::=  "assert" expression ["," expression]

간단한 형식인 assert expression은 다음과 같습니다.

if __debug__:
    if not expression: raise AssertionError

확장된 형식인 assert expression1, expression2는 다음과 같습니다.

if __debug__:
    if not expression1: raise AssertionError(expression2)

이러한 동등성은 __debug__ 및 AssertionError가 해당 이름을 가진 내장 변수를 참조한다고 가정합니다. 현재 구현에서 기본 제공 변수 __debug__는 정상적인 상황에서 True이고 최적화가 요청되면 False입니다(명령줄 옵션 -O). 현재 코드 생성기는 컴파일 타임에 최적화가 요청될 때 assert 문에 대한 코드를 생성하지 않습니다. 오류 메시지에 실패한 식의 소스 코드를 포함할 필요는 없습니다. 스택 추적의 일부로 표시됩니다.

__debug__에 대한 지정은 불법입니다. 내장 변수의 값은 인터프리터가 시작될 때 결정됩니다.

7.4. The pass statement

pass_stmt ::=  "pass"

pass는 null 작업입니다. 실행될 때 아무 일도 일어나지 않습니다. 명령문이 구문상 필요하지만 코드를 실행할 필요가 없는 경우 자리 표시자로 유용합니다. 예를 들면 다음과 같습니다.

def f(arg): pass    # a function that does nothing (yet)

class C: pass       # a class with no methods (yet)

7.5. The del statement

del_stmt ::=  "del" target_list

삭제는 할당이 정의되는 방식과 매우 유사하게 재귀적으로 정의됩니다. 자세히 설명하는 대신 몇 가지 힌트를 드리겠습니다.

대상 목록을 삭제하면 각 대상이 왼쪽에서 오른쪽으로 재귀적으로 삭제됩니다.

이름을 삭제하면 이름이 동일한 코드 블록의 전역 문에 있는지 여부에 따라 로컬 또는 전역 네임스페이스에서 해당 이름의 바인딩이 제거됩니다. 이름이 바인딩되지 않은 경우 NameError 예외가 발생합니다.

속성 참조, 구독 및 슬라이싱의 삭제는 관련된 기본 객체로 전달됩니다. 슬라이싱의 삭제는 일반적으로 올바른 유형의 빈 슬라이스를 할당하는 것과 동일합니다(그러나 이마저도 슬라이싱된 객체에 의해 결정됨).

버전 3.2에서 변경: 이전에는 중첩된 블록에서 자유 변수로 발생하는 이름을 로컬 네임스페이스에서 삭제하는 것이 불법이었습니다.

7.6. The return statement

return_stmt ::=  "return" [expression_list]

return은 중첩된 클래스 정의가 아닌 함수 정의에 구문적으로 중첩된 경우에만 발생할 수 있습니다.

식 목록이 있으면 평가되고 그렇지 않으면 None으로 대체됩니다.

return은 표현식 목록(또는 None)을 반환 값으로 사용하여 현재 함수 호출을 떠납니다.

return이 finally 절과 함께 try 문 밖으로 제어를 넘길 때 해당 finally 절은 실제로 함수를 떠나기 전에 실행됩니다.

제너레이터 함수에서 return 문은 제너레이터가 완료되었고 StopIteration이 발생했음을 나타냅니다. 반환된 값(있는 경우)은 StopIteration을 생성하기 위한 인수로 사용되며 StopIteration.value 속성이 됩니다.

비동기 생성기 함수에서 빈 return 문은 비동기 생성기가 완료되었음을 나타내며 StopAsyncIteration이 발생합니다. 비어 있지 않은 return 문은 비동기 생성기 함수의 구문 오류입니다.

7.7. The yield statement

yield_stmt ::=  yield_expression

yield 문은 의미상 yield 표현식과 동일합니다. yield 문은 동등한 yield 표현식 문에 필요한 괄호를 생략하는 데 사용할 수 있습니다. 예를 들어, yield 문은

yield <expr>
yield from <expr>

yield 표현식 문과 동일합니다.

(yield <expr>)
(yield from <expr>)

Yield 식과 문은 생성기 함수를 정의할 때만 사용되며 생성기 함수의 본문에서만 사용됩니다. 함수 정의에서 yield를 사용하면 해당 정의가 일반 함수 대신 생성기 함수를 생성하기에 충분합니다.

수율 의미 체계에 대한 자세한 내용은 수율 표현식 섹션을 참조하세요.

7.8. The raise statement

raise_stmt ::=  "raise" [expression ["from" expression]]

표현식이 없으면 raise는 현재 처리 중인 예외(활성 예외라고도 함)를 다시 발생시킵니다. 현재 활성 예외가 없으면 이것이 오류임을 나타내는 RuntimeError 예외가 발생합니다.

그렇지 않으면 raise는 첫 번째 표현식을 예외 객체로 평가합니다. 서브클래스이거나 BaseException의 인스턴스여야 합니다. 클래스인 경우 인수 없이 클래스를 인스턴스화하여 필요할 때 예외 인스턴스를 얻습니다.

예외 유형은 예외 인스턴스의 클래스이고 값은 인스턴스 자체입니다.

트레이스백 객체는 일반적으로 예외가 발생하고 쓰기 가능한 __traceback__ 속성으로 첨부될 때 자동으로 생성됩니다. 다음과 같이 with_traceback() 예외 메서드(동일한 예외 인스턴스를 반환하고 트레이스백이 인수로 설정됨)를 사용하여 한 단계에서 예외를 생성하고 자신만의 트레이스백을 설정할 수 있습니다.

raise Exception("foo occurred").with_traceback(tracebackobj)

from 절은 예외 연결에 사용됩니다. 주어진 경우 두 번째 표현식은 다른 예외 클래스 또는 인스턴스여야 합니다. 두 번째 표현식이 예외 인스턴스인 경우 발생한 예외에 __cause__ 속성(쓰기 가능)으로 연결됩니다. 식이 예외 클래스인 경우 클래스가 인스턴스화되고 결과 예외 인스턴스가 발생한 예외에 __cause__ 특성으로 연결됩니다. 발생한 예외가 처리되지 않으면 두 예외가 모두 인쇄됩니다.

>>> try:
...     print(1 / 0)
... except Exception as exc:
...     raise RuntimeError("Something bad happened") from exc
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened

예외가 이미 처리되고 있을 때 새 예외가 발생하면 유사한 메커니즘이 암시적으로 작동합니다. except나 finally 절, with 문이 사용될 때 예외가 처리될 수 있습니다. 그러면 이전 예외가 새 예외의 __context__ 속성으로 첨부됩니다.

>>> try:
...     print(1 / 0)
... except:
...     raise RuntimeError("Something bad happened")
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened

예외 연결은 from 절에 None을 지정하여 명시적으로 억제할 수 있습니다.

>>> try:
...     print(1 / 0)
... except:
...     raise RuntimeError("Something bad happened") from None
... 
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened

예외에 대한 추가 정보는 예외 섹션에서 찾을 수 있으며 예외 처리에 대한 정보는 섹션 The try 문에서 찾을 수 있습니다.

버전 3.3에서 변경: 이제 Y에서 X를 올릴 때 Y로 없음이 허용됩니다.

버전 3.3의 새로운 기능: 예외 컨텍스트의 자동 표시를 억제하는 __suppress_context__ 속성.

버전 3.11에서 변경: 활성 예외의 트레이스백이 except 절에서 수정되면 후속 raise 문은 수정된 트레이스백으로 예외를 다시 발생시킵니다. 이전에는 예외가 포착되었을 때 가지고 있던 역추적과 함께 예외가 다시 발생했습니다.

7.9. The break statement

break_stmt ::=  "break"

break는 for 또는 while 루프에 구문적으로 중첩된 경우에만 발생할 수 있지만 해당 루프 내의 함수 또는 클래스 정의에는 중첩되지 않습니다.

루프에 루프가 있는 경우 선택적 else 절을 건너뛰고 가장 가까운 둘러싸는 루프를 종료합니다.

for 루프가 break에 의해 종료되면 루프 제어 대상은 현재 값을 유지합니다.

break가 finally 절과 함께 try 문 밖으로 제어를 넘길 때 finally 절은 실제로 루프를 떠나기 전에 실행됩니다.

7.10. The continue statement

continue_stmt ::=  "continue"

continue는 for 또는 while 루프에 구문적으로 중첩되어만 발생할 수 있지만 해당 루프 내의 함수 또는 클래스 정의에는 중첩되지 않습니다. 가장 가까운 둘러싸는 루프의 다음 주기로 계속됩니다.

continue가 finally 절과 함께 try 문 밖으로 제어를 넘길 때 해당 finally 절은 다음 루프 주기를 실제로 시작하기 전에 실행됩니다.

7.11. The import statement

import_stmt     ::=  "import" module ["as" identifier] ("," module ["as" identifier])*
                     | "from" relative_module "import" identifier ["as" identifier]
                     ("," identifier ["as" identifier])*
                     | "from" relative_module "import" "(" identifier ["as" identifier]
                     ("," identifier ["as" identifier])* [","] ")"
                     | "from" relative_module "import" "*"
module          ::=  (identifier ".")* identifier
relative_module ::=  "."* module | "."+

기본 import 문(from 절 없음)은 두 단계로 실행됩니다.

  1. 모듈 찾기, 필요한 경우 로드 및 초기화
  2. import 문이 발생하는 범위의 로컬 네임스페이스에서 이름을 정의합니다.

명령문에 여러 절(쉼표로 구분)이 포함되어 있으면 절이 개별 가져오기 명령문으로 분리된 것처럼 두 단계가 각 절에 대해 개별적으로 수행됩니다.

첫 번째 단계인 모듈 찾기 및 로드에 대한 자세한 내용은 가져올 수 있는 다양한 유형의 패키지 및 모듈과 사용할 수 있는 모든 후크를 설명하는 가져오기 시스템 섹션에 자세히 설명되어 있습니다. 가져오기 시스템을 사용자 지정합니다. 이 단계의 실패는 모듈을 찾을 수 없거나 모듈 코드 실행을 포함하여 모듈을 초기화하는 동안 오류가 발생했음을 나타낼 수 있습니다.

요청된 모듈이 성공적으로 검색되면 다음 세 가지 방법 중 하나로 로컬 네임스페이스에서 사용할 수 있습니다.

  • 모듈 이름 뒤에 as가 오면 as 뒤에 오는 이름은 가져온 모듈에 직접 연결됩니다.
  • 다른 이름이 지정되지 않고 가져오는 모듈이 최상위 모듈인 경우 모듈의 이름은 가져온 모듈에 대한 참조로 로컬 네임스페이스에 바인딩됩니다.
  • 가져오는 모듈이 최상위 모듈이 아닌 경우 모듈을 포함하는 최상위 패키지의 이름은 최상위 패키지에 대한 참조로 로컬 네임스페이스에 바인딩됩니다. 가져온 모듈은 직접 접근하는 것보다 전체 정규화된 이름을 사용하여 접근해야 합니다.

from 형식은 약간 더 복잡한 프로세스를 사용합니다.

  1. from 절에 지정된 모듈을 찾고 필요한 경우 로드하고 초기화합니다.
  2. 가져오기 절에 지정된 각 식별자에 대해:
    1. 가져온 모듈에 해당 이름의 속성이 있는지 확인하십시오.
    2. 그렇지 않은 경우 해당 이름의 하위 모듈을 가져온 다음 해당 속성에 대해 가져온 모듈을 다시 확인하십시오.
    3. 속성이 발견되지 않으면 ImportError가 발생합니다.
    4. 그렇지 않으면 해당 값에 대한 참조가 로컬 네임스페이스에 저장되며, 존재하는 경우 as 절의 이름을 사용하고 그렇지 않으면 속성 이름을 사용합니다.

예:

import foo                 # foo imported and bound locally
import foo.bar.baz         # foo, foo.bar, and foo.bar.baz imported, foo bound locally
import foo.bar.baz as fbb  # foo, foo.bar, and foo.bar.baz imported, foo.bar.baz bound as fbb
from foo.bar import baz    # foo, foo.bar, and foo.bar.baz imported, foo.bar.baz bound as baz
from foo import attr       # foo imported and foo.attr bound as attr

식별자 목록이 별표(‘*’)로 대체되면 모듈에 정의된 모든 공개 이름이 import 문이 발생하는 범위의 로컬 네임스페이스에 바인딩됩니다.

모듈에 의해 정의된 공개 이름은 __all__이라는 변수에 대한 모듈의 네임스페이스를 확인하여 결정됩니다. 정의된 경우 해당 모듈에서 정의하거나 가져온 이름인 일련의 문자열이어야 합니다. __all__에 지정된 이름은 모두 공개된 것으로 간주되며 존재해야 합니다. __all__이 정의되지 않은 경우 공개 이름 집합에는 밑줄 문자(‘_’)로 시작하지 않는 모듈의 이름 공간에서 발견된 모든 이름이 포함됩니다. __all__은 전체 공개 API를 포함해야 합니다. 이는 API의 일부가 아닌 항목(예: 모듈 내에서 가져와 사용된 라이브러리 모듈)을 실수로 내보내는 것을 방지하기 위한 것입니다.

import의 와일드카드 형식(from module import *)은 모듈 수준에서만 허용됩니다. 클래스 또는 함수 정의에서 사용하려고 하면 SyntaxError가 발생합니다.

가져올 모듈을 지정할 때 모듈의 절대 이름을 지정할 필요가 없습니다. 모듈이나 패키지가 다른 패키지에 포함되어 있는 경우 패키지 이름을 언급하지 않고도 동일한 상위 패키지 내에서 상대적 가져오기를 수행할 수 있습니다. 지정된 모듈 또는 패키지에서 선행 점을 사용하여 정확한 이름을 지정하지 않고 현재 패키지 계층 구조를 위로 이동하는 높이를 지정할 수 있습니다. 선행 점 하나는 가져오기를 수행하는 모듈이 있는 현재 패키지를 의미합니다. 두 개의 점은 한 패키지 수준을 의미합니다. 세 개의 점은 두 단계 위입니다. 따라서 . pkg 패키지의 모듈에서 mod를 가져오면 pkg.mod를 가져오게 됩니다. pkg.subpkg1 내에서 from ..subpkg2 import mod를 실행하면 pkg.subpkg2.mod를 가져옵니다. 상대 가져오기에 대한 사양은 패키지 상대 가져오기 섹션에 포함되어 있습니다.

importlib.import_module()은 로드할 모듈을 동적으로 결정하는 애플리케이션을 지원하기 위해 제공됩니다.

module, filename, sys.path, sys.meta_path, sys.path_hooks 인수를 사용하여 감사 이벤트 가져오기를 발생시킵니다.

7.11.1. Future statements

future 문은 특정 모듈이 기능이 표준이 되는 Python의 향후 릴리스에서 사용할 수 있는 구문 또는 의미 체계를 사용하여 컴파일되어야 한다는 컴파일러에 대한 지시어입니다.

future 문은 언어에 호환되지 않는 변경 사항을 도입하는 Python의 향후 버전으로의 마이그레이션을 쉽게 하기 위한 것입니다. 기능이 표준이 되는 릴리스 전에 모듈별로 새 기능을 사용할 수 있습니다.

future_stmt ::=  "from" "__future__" "import" feature ["as" identifier]
                 ("," feature ["as" identifier])*
                 | "from" "__future__" "import" "(" feature ["as" identifier]
                 ("," feature ["as" identifier])* [","] ")"
feature     ::=  identifier

future 문은 모듈 상단 근처에 나타나야 합니다. 미래 문 앞에 나타날 수 있는 유일한 줄은 다음과 같습니다.

  • 모듈 독스트링(있는 경우),
  • 코멘트,
  • 빈 줄 및
  • 다른 미래 진술.

future 문을 사용해야 하는 유일한 기능은 주석입니다(PEP 563 참조).

future 문으로 활성화된 모든 역사적 기능은 여전히 Python 3에서 인식됩니다. 목록에는 absolute_import, division, generators, generator_stop, unicode_literals, print_function, nested_scopes 및 with_statement가 포함됩니다. 항상 활성화되어 있고 이전 버전과의 호환성을 위해서만 유지되기 때문에 모두 중복됩니다.

퓨처 문은 컴파일 타임에 특별히 인식되고 처리됩니다. 핵심 구조의 의미 체계에 대한 변경 사항은 종종 다른 코드를 생성하여 구현됩니다. 새로운 기능이 호환되지 않는 새로운 구문(예: 새 예약어)을 도입하는 경우일 수도 있으며, 이 경우 컴파일러는 모듈을 다르게 구문 분석해야 할 수 있습니다. 이러한 결정은 런타임까지 미룰 수 없습니다.

지정된 릴리스에 대해 컴파일러는 어떤 기능 이름이 정의되었는지 알고 있으며 future 문에 알려지지 않은 기능이 포함된 경우 컴파일 시간 오류를 발생시킵니다.

직접 런타임 시맨틱은 import 문과 동일합니다. 표준 모듈 __future__가 있으며, 이는 나중에 설명되며 future 문이 실행될 때 일반적인 방식으로 가져옵니다.

흥미로운 런타임 시맨틱은 future 문으로 활성화된 특정 기능에 따라 다릅니다.

진술에 특별한 것은 없습니다.

import __future__ [as name]

그것은 미래의 진술이 아닙니다. 특별한 의미 체계나 구문 제한이 없는 일반적인 import 문입니다.

future 문을 포함하는 모듈 M에서 발생하는 내장 함수 exec() 및 compile()에 대한 호출로 컴파일된 코드는 기본적으로 future 문과 관련된 새 구문 또는 의미 체계를 사용합니다. 이것은 compile()에 대한 선택적 인수로 제어할 수 있습니다 — 자세한 내용은 해당 함수의 문서를 참조하십시오.

인터랙티브 인터프리터 프롬프트에 입력된 미래 문장은 나머지 인터프리터 세션에 적용됩니다. 인터프리터가 -i 옵션으로 시작되고 실행할 스크립트 이름이 전달되고 스크립트에 future 문이 포함된 경우 스크립트가 실행된 후 시작된 대화식 세션에 적용됩니다.

See also
PEP 236 – Back to the __future__
__future__ 메커니즘에 대한 원래 제안.

7.12. The global statement

global_stmt ::=  "global" identifier ("," identifier)*

global 문은 전체 현재 코드 블록에 적용되는 선언입니다. 이는 나열된 식별자가 전역으로 해석됨을 의미합니다. 자유 변수가 전역으로 선언되지 않고 전역을 참조할 수 있지만 전역 없이 전역 변수에 할당하는 것은 불가능합니다.

global 문에 나열된 이름은 해당 global 문 앞에 텍스트로 동일한 코드 블록에서 사용되어서는 안 됩니다.

전역 문에 나열된 이름은 형식 매개 변수나 with 문이나 except 절의 대상 또는 for 대상 목록, 클래스 정의, 함수 정의, import 문 또는 변수 주석으로 정의되어서는 안 됩니다.

CPython 구현 세부 사항: 현재 구현은 이러한 제한 중 일부를 시행하지 않지만, 프로그램은 이 자유를 남용해서는 안 됩니다. 향후 구현에서 이를 시행하거나 프로그램의 의미를 자동으로 변경할 수 있기 때문입니다.

프로그래머 메모: global은 파서에 대한 지시문입니다. global 문과 동시에 구문 분석된 코드에만 적용됩니다. 특히 내장 exec() 함수에 제공된 문자열 또는 코드 객체에 포함된 전역 문은 함수 호출을 포함하는 코드 블록에 영향을 미치지 않으며 이러한 문자열에 포함된 코드는 다음을 포함하는 코드의 전역 문에 의해 영향을 받지 않습니다. 함수 호출. eval() 및 compile() 함수에도 동일하게 적용됩니다.

7.13. The nonlocal statement

nonlocal_stmt ::=  "nonlocal" identifier ("," identifier)*

nonlocal 문은 나열된 식별자가 전역을 제외하고 가장 가까운 둘러싸는 범위에서 이전에 바인딩된 변수를 참조하도록 합니다. 바인딩의 기본 동작은 로컬 네임스페이스를 먼저 검색하는 것이기 때문에 이는 중요합니다. 이 명령문을 사용하면 캡슐화된 코드가 전역(모듈) 범위 외에 로컬 범위 외부의 변수를 다시 바인딩할 수 있습니다.

nonlocal 문에 나열된 이름은 global 문에 나열된 이름과 달리 둘러싸는 범위의 기존 바인딩을 참조해야 합니다(새 바인딩을 만들어야 하는 범위를 명확하게 결정할 수 없음).

nonlocal 문에 나열된 이름은 로컬 범위의 기존 바인딩과 충돌하지 않아야 합니다.

See also
PEP 3104 – Access to Names in Outer Scopes
nonlocal 문에 대한 사양입니다.

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

Python Language Reference >6. Expressions

이 장에서는 파이썬에서 표현식 요소의 의미를 설명합니다.

구문 참고: 이 장과 다음 장에서는 어휘 분석이 아닌 구문을 설명하기 위해 확장된 BNF 표기법을 사용합니다. 구문 규칙의 형식이 다음과 같은 경우(대안 중 하나)

name ::=  othername

의미론이 주어지지 않고, 이 형태의 이름의 의미론은 othername과 동일합니다.

6.1. Arithmetic conversions

아래 산술 연산자에 대한 설명에서 “숫자 인수가 공통 유형으로 변환됩니다”라는 문구를 사용하는 경우 이는 기본 제공 유형에 대한 연산자 구현이 다음과 같이 작동함을 의미합니다.

  • 인수 중 하나가 복소수이면 다른 인수는 복소수로 변환됩니다.
  • 그렇지 않고 인수 중 하나가 부동 소수점 숫자이면 다른 인수는 부동 소수점으로 변환됩니다.
  • 그렇지 않으면 둘 다 정수여야 하며 변환이 필요하지 않습니다.

일부 추가 규칙이 특정 연산자에 적용됩니다(예: ‘%’ 연산자의 왼쪽 인수인 문자열). 확장은 자체 변환 동작을 정의해야 합니다.

6.2. Atoms

원자는 표현식의 가장 기본적인 요소입니다. 가장 간단한 원자는 식별자 또는 리터럴입니다. 괄호, 대괄호 또는 중괄호로 묶인 형식도 구문적으로 원자로 분류됩니다. 원자의 구문은 다음과 같습니다.

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom

6.2.1. Identifiers (Names)

원자로 나타나는 식별자는 이름입니다. 어휘 정의에 대해서는 식별자 및 키워드 섹션을 참조하고 이름 지정 및 바인딩에 대한 문서는 이름 지정 및 바인딩 섹션을 참조하세요.

이름이 개체에 바인딩되면 원자의 평가가 해당 개체를 생성합니다. 이름이 바인딩되지 않은 경우 이름을 평가하려고 하면 NameError 예외가 발생합니다.

Private name mangling: 클래스 정의에서 텍스트로 나타나는 식별자가 두 개 이상의 밑줄 문자로 시작하고 두 개 이상의 밑줄로 끝나지 않는 경우 해당 클래스의 개인 이름으로 간주됩니다. 개인 이름은 코드가 생성되기 전에 더 긴 형식으로 변환됩니다. 변환은 선행 밑줄이 제거되고 단일 밑줄이 삽입된 클래스 이름을 이름 앞에 삽입합니다. 예를 들어 Ham이라는 클래스에서 발생하는 식별자 __spam은 _Ham__spam으로 변환됩니다. 이 변환은 식별자가 사용되는 구문 컨텍스트와 무관합니다. 변환된 이름이 너무 긴 경우(255자 초과) 구현 정의 잘림이 발생할 수 있습니다. 클래스 이름이 밑줄로만 구성된 경우 변환이 수행되지 않습니다.

6.2.2. Literals

Python은 문자열 및 바이트 리터럴과 다양한 숫자 리터럴을 지원합니다.

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber

리터럴을 평가하면 주어진 값을 가진 주어진 유형(문자열, 바이트, 정수, 부동 소수점 숫자, 복소수)의 객체가 산출됩니다. 부동 소수점 및 허수(복소수) 리터럴의 경우 값을 근사화할 수 있습니다. 자세한 내용은 리터럴 섹션을 참조하십시오.

모든 리터럴은 변경할 수 없는 데이터 유형에 해당하므로 개체의 ID는 해당 값보다 덜 중요합니다. 동일한 값(프로그램 텍스트에서 동일한 항목 또는 다른 항목)을 가진 리터럴을 여러 번 평가하면 동일한 개체 또는 동일한 값을 가진 다른 개체를 얻을 수 있습니다.

6.2.3. Parenthesized forms

괄호로 묶인 형식은 괄호로 묶인 선택적 표현식 목록입니다.

parenth_form ::=  "(" [starred_expression] ")"

괄호로 묶인 표현식 목록은 그 표현식 목록이 산출하는 모든 것을 산출합니다. 목록에 적어도 하나의 쉼표가 포함되어 있으면 튜플을 산출합니다. 그렇지 않으면 식 목록을 구성하는 단일 식을 생성합니다.

빈 괄호 쌍은 빈 튜플 객체를 생성합니다. 튜플은 변경할 수 없기 때문에 리터럴과 동일한 규칙이 적용됩니다(즉, 빈 튜플이 두 번 발생하면 동일한 객체가 생성될 수도 있고 생성되지 않을 수도 있음).

튜플은 괄호로 구성되지 않고 쉼표를 사용하여 구성됩니다. 예외는 괄호가 필요한 빈 튜플입니다. 식에서 괄호 안의 “아무것도”를 허용하지 않으면 모호성이 발생하고 일반적인 오타가 잡히지 않고 전달될 수 있습니다.

6.2.4. Displays for lists, sets and dictionaries

목록을 구성하기 위해 집합 또는 사전 Python은 “디스플레이”라는 특수 구문을 제공하며 각각 두 가지 특징이 있습니다.

  • 컨테이너 내용이 명시적으로 나열되거나
  • 이해라고 하는 루핑 및 필터링 명령 세트를 통해 계산됩니다.

컴프리헨션의 일반적인 구문 요소는 다음과 같습니다.

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]

내포는 하나 이상의 for 절과 0개 이상의 for 또는 if 절이 뒤따르는 단일 표현식으로 구성됩니다. 이 경우 새 컨테이너의 요소는 각 for 또는 if 절을 블록으로 간주하고 왼쪽에서 오른쪽으로 중첩하고 가장 안쪽 블록에 도달할 때마다 요소를 생성하는 표현식을 평가하여 생성되는 요소입니다.

그러나 가장 왼쪽 for 절의 iterable 표현식을 제외하고 내포는 별도의 암시적으로 중첩된 범위에서 실행됩니다. 이렇게 하면 대상 목록에 할당된 이름이 둘러싸는 범위로 “누설”되지 않습니다.

가장 왼쪽 for 절의 iterable 표현식은 바깥쪽 범위에서 직접 평가된 다음 암시적으로 중첩된 범위에 인수로 전달됩니다. 후속 for 절과 가장 왼쪽 for 절의 필터 조건은 가장 왼쪽 iterable에서 얻은 값에 따라 달라질 수 있으므로 둘러싸는 범위에서 평가할 수 없습니다. 예: [범위(x, x+10)의 y에 대한 범위(10)의 x에 대한 x*y].

이해를 통해 항상 적절한 유형의 컨테이너가 생성되도록 하려면 암시적으로 중첩된 범위에서 표현식의 yield 및 yield가 금지됩니다.

Python 3.6부터 async def 함수에서 async for 절을 사용하여 비동기 이터레이터를 반복할 수 있습니다. async def 함수의 컴프리헨션은 선행 표현식 뒤에 오는 for 또는 async for 절로 구성될 수 있고 추가 for 또는 async for 절을 포함할 수 있으며 await 표현식을 사용할 수도 있습니다. 컴프리헨션에 async for 절이나 await 표현식 또는 기타 비동기 컴프리헨션이 포함되어 있으면 이를 비동기 컴프리헨션이라고 합니다. 비동기 이해는 나타나는 코루틴 함수의 실행을 일시 중단할 수 있습니다. PEP 530도 참조하십시오.

버전 3.6의 새로운 기능: 비동기 이해가 도입되었습니다.

버전 3.8에서 변경: 암시적으로 중첩된 범위에서 yield 및 yield from 금지.

버전 3.11에서 변경: 이제 비동기 함수의 이해 내에서 비동기 이해가 허용됩니다. 외부 이해는 암시적으로 비동기화됩니다.

6.2.5. List displays

목록 표시는 대괄호로 묶인 비어 있는 일련의 표현식입니다.

list_display ::=  "[" [starred_list | comprehension] "]"

목록 표시는 새 목록 개체를 생성하며 내용은 식 목록 또는 이해에 의해 지정됩니다. 쉼표로 구분된 표현식 목록이 제공되면 해당 요소는 왼쪽에서 오른쪽으로 평가되고 해당 순서대로 목록 객체에 배치됩니다. Comprehension이 제공되면 목록은 Comprehension의 결과 요소로 구성됩니다.

6.2.6. Set displays

집합 디스플레이는 중괄호로 표시되며 키와 값을 구분하는 콜론이 없다는 점에서 사전 디스플레이와 구분됩니다.

set_display ::=  "{" (starred_list | comprehension) "}"

집합 표시는 새로운 변경 가능한 집합 개체를 생성하며 내용은 일련의 표현식 또는 이해에 의해 지정됩니다. 쉼표로 구분된 표현식 목록이 제공되면 해당 요소가 왼쪽에서 오른쪽으로 평가되고 집합 개체에 추가됩니다. 컴프리헨션이 제공되면 컴프리헨션의 결과 요소로 집합이 구성됩니다.

빈 set는 {}로 생성할 수 없습니다. 이 리터럴은 빈 dictionary을 구성합니다.

6.2.7. Dictionary displays

사전 표시는 중괄호로 묶인 빈 일련의 키/데이텀 쌍일 수 있습니다.

dict_display       ::=  "{" [key_datum_list | dict_comprehension] "}"
key_datum_list     ::=  key_datum ("," key_datum)* [","]
key_datum          ::=  expression ":" expression | "**" or_expr
dict_comprehension ::=  expression ":" expression comp_for

사전 표시는 새 사전 개체를 생성합니다.

키/데이터 쌍의 쉼표로 구분된 시퀀스가 제공되면 사전의 항목을 정의하기 위해 왼쪽에서 오른쪽으로 평가됩니다. 각 키 객체는 해당 데이터를 저장하기 위해 사전에 대한 키로 사용됩니다. 즉, 키/데이텀 목록에서 동일한 키를 여러 번 지정할 수 있으며 해당 키에 대한 최종 사전 값은 마지막으로 지정된 값이 됩니다.

이중 별표 **는 사전 압축 풀기를 나타냅니다. 해당 피연산자는 매핑이어야 합니다. 각 매핑 항목이 새 사전에 추가됩니다. 이후 값은 이전 키/데이텀 쌍 및 이전 사전 압축 풀기에 의해 이미 설정된 값을 대체합니다.

버전 3.5의 새로운 기능: 원래 PEP 448에서 제안한 사전 표시로 압축 풀기.

list 및 set comprehension과 달리 dict comprehension은 일반적인 “for” 및 “if” 절이 뒤에 오는 콜론으로 구분된 두 개의 표현식이 필요합니다. Comprehension이 실행되면 결과 키 및 값 요소가 생성된 순서대로 새 사전에 삽입됩니다.

키 값의 유형에 대한 제한 사항은 앞부분의 표준 유형 계층 구조 섹션에 나열되어 있습니다. (요약하면 키 유형은 해시 가능해야 하며 변경 가능한 모든 객체를 제외합니다.) 중복 키 간의 충돌은 감지되지 않습니다. 주어진 키 값에 대해 저장된 마지막 데이텀(디스플레이에서 가장 오른쪽에 있는 텍스트)이 우선합니다.

버전 3.8에서 변경: Python 3.8 이전에는 dict 컴프리헨션에서 키와 값의 평가 순서가 잘 정의되지 않았습니다. CPython에서 값은 키보다 먼저 평가되었습니다. 3.8부터는 PEP 572에서 제안한 대로 키가 값보다 먼저 평가됩니다.

6.2.8. Generator expressions

제너레이터 표현식은 괄호로 묶인 간결한 제너레이터 표기법입니다.

generator_expression ::=  "(" expression comp_for ")"

제너레이터 표현식은 새로운 제너레이터 객체를 생성합니다. 구문은 대괄호나 중괄호 대신 괄호로 묶인다는 점을 제외하고 컴프리헨션과 동일합니다.

제너레이터 표현식에 사용된 변수는 제너레이터 객체에 대해 __next__() 메서드가 호출될 때 느리게 평가됩니다(일반 제너레이터와 동일한 방식으로). 그러나 가장 왼쪽 for 절의 iterable 표현식은 즉시 평가되므로 이로 인해 생성된 오류는 첫 번째 값이 검색된 지점이 아니라 생성기 표현식이 정의된 지점에서 방출됩니다. 후속 for 절과 가장 왼쪽 for 절의 필터 조건은 가장 왼쪽 iterable에서 얻은 값에 따라 달라질 수 있으므로 둘러싸는 범위에서 평가할 수 없습니다. 예: (범위(x, x+10)의 y에 대한 범위(10)의 x에 대한 x*y).

인수가 하나만 있는 호출에서는 괄호를 생략할 수 있습니다. 자세한 내용은 호출 섹션을 참조하십시오.

생성기 표현식 자체의 예상 작동을 방해하지 않기 위해 암시적으로 정의된 생성기에서 표현식의 yield 및 yield가 금지됩니다.

생성기 표현식에 async for 절 또는 await 표현식이 포함된 경우 이를 비동기 생성기 표현식이라고 합니다. 비동기 제너레이터 표현식은 비동기 이터레이터인 새 비동기 제너레이터 객체를 반환합니다(비동기 이터레이터 참조).

버전 3.6의 새로운 기능: 비동기 생성기 표현식이 도입되었습니다.

버전 3.7에서 변경: Python 3.7 이전에는 비동기 생성기 표현식이 async def 코루틴에만 나타날 수 있었습니다. 3.7부터 모든 함수는 비동기 생성기 표현식을 사용할 수 있습니다.

버전 3.8에서 변경: 암시적으로 중첩된 범위에서 yield 및 yield from 금지.

6.2.9. Yield expressions

yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]

yield 표현식은 generator 함수 또는 asynchronous generator 함수를 정의할 때 사용되므로 함수 정의의 본문에서만 사용할 수 있습니다. 함수 본문에서 yield 표현식을 사용하면 해당 함수가 생성기 함수가 되고 async def 함수의 본문에서 사용하면 해당 코루틴 함수가 비동기 생성기 함수가 됩니다. 예를 들어:

def gen():  # defines a generator function
    yield 123

async def agen(): # defines an asynchronous generator function
    yield 123

포함 범위에 대한 부작용으로 인해 이해 및 생성기 표현식을 구현하는 데 사용되는 암시적으로 정의된 범위의 일부로 yield 표현식이 허용되지 않습니다.

버전 3.8에서 변경: 컴프리헨션 및 제너레이터 표현식을 구현하는 데 사용되는 암시적으로 중첩된 범위에서 Yield 표현식이 금지됩니다.

생성기 기능은 아래에 설명되어 있으며 비동기식 생성기 기능은 비동기식 생성기 기능 섹션에서 별도로 설명합니다.

제너레이터 함수가 호출되면 제너레이터라고 하는 이터레이터를 반환합니다. 그런 다음 해당 생성기가 생성기 기능의 실행을 제어합니다. 생성기의 메서드 중 하나가 호출되면 실행이 시작됩니다. 그 때 실행은 첫 번째 yield 표현식으로 진행되며 여기서 다시 일시 중단되어 expression_list의 값을 생성기의 호출자에게 반환하거나 expression_list가 생략된 경우 None을 반환합니다. 일시 중단이란 로컬 변수의 현재 바인딩, 명령 포인터, 내부 평가 스택 및 모든 예외 처리 상태를 포함하여 모든 로컬 상태가 유지됨을 의미합니다. 생성기의 메서드 중 하나를 호출하여 실행을 재개하면 함수는 yield 표현식이 또 다른 외부 호출인 것처럼 정확하게 진행할 수 있습니다. 재개 후 yield 표현식의 값은 실행을 재개한 메서드에 따라 다릅니다. __next__()가 사용되면(일반적으로 for 또는 next() 내장을 통해) 결과는 None입니다. 그렇지 않고 send()를 사용하면 결과는 해당 메서드에 전달된 값이 됩니다.

이 모든 것이 생성기 기능을 코루틴과 매우 유사하게 만듭니다. 여러 번 양보하고 진입점이 두 개 이상 있으며 실행이 일시 중지될 수 있습니다. 유일한 차이점은 제너레이터 함수는 yield 후에 실행이 계속되어야 하는 위치를 제어할 수 없다는 것입니다. 제어는 항상 제너레이터의 호출자에게 전달됩니다.

yield 표현식은 try 구성의 모든 위치에서 허용됩니다. 제너레이터가 종료되기 전에 재개되지 않으면(0 참조 카운트에 도달하거나 가비지 수집됨으로써), 제너레이터-이터레이터의 close() 메서드가 호출되어 계류 중인 모든 finally 절이 실행될 수 있습니다.

의 yield를 사용하는 경우 제공된 표현식은 이터러블이어야 합니다. iterable을 반복하여 생성된 값은 현재 생성기 메서드의 호출자에게 직접 전달됩니다. send()로 전달된 모든 값과 throw()로 전달된 모든 예외는 적절한 메서드가 있는 경우 기본 반복자에게 전달됩니다. 그렇지 않은 경우 send()는 AttributeError 또는 TypeError를 발생시키는 반면 throw()는 전달된 예외를 즉시 발생시킵니다.

기본 반복자가 완료되면 발생한 StopIteration 인스턴스의 값 속성이 yield 표현식의 값이 됩니다. StopIteration을 발생시킬 때 명시적으로 설정하거나 하위 반복자가 생성기일 때 자동으로 설정될 수 있습니다(하위 생성기에서 값을 반환하여).

버전 3.3에서 변경: 제어 흐름을 하위 반복자에게 위임하기 위해 의 yield를 추가했습니다.

대입문 오른쪽에 yield 표현식이 유일한 표현식인 경우 괄호를 생략할 수 있습니다.

See also
PEP 255 – Simple Generators
Python에 생성기 및 yield 문을 추가하기 위한 제안.
PEP 342 – Coroutines via Enhanced Generators
API 및 생성기 구문을 개선하여 간단한 코루틴으로 사용할 수 있도록 제안합니다.
PEP 380 – Syntax for Delegating to a Subgenerator
하위 생성자에게 쉽게 위임할 수 있도록 yield_from 구문을 도입하자는 제안.
PEP 525 – Asynchronous Generators
코루틴 함수에 생성기 기능을 추가하여 PEP 492에서 확장된 제안입니다.

6.2.9.1. Generator-iterator methods

이 하위 섹션에서는 생성기 반복자의 메서드를 설명합니다. 생성기 기능의 실행을 제어하는 데 사용할 수 있습니다.

제너레이터가 이미 실행 중일 때 아래 제너레이터 메서드를 호출하면 ValueError 예외가 발생합니다.

generator.__next__()

생성기 함수의 실행을 시작하거나 마지막으로 실행된 yield 표현식에서 다시 시작합니다. 제너레이터 함수가 __next__() 메서드로 재개되면 현재 yield 표현식은 항상 None으로 평가됩니다. 그런 다음 실행은 다음 yield 표현식으로 계속되며 여기서 생성기는 다시 일시 중지되고 expression_list의 값은 __next__()의 호출자에게 반환됩니다. 생성기가 다른 값을 생성하지 않고 종료하면 StopIteration 예외가 발생합니다.

이 메서드는 일반적으로 암시적으로 호출됩니다. for 루프 또는 내장 next() 함수를 통해.

generator.send(value)

실행을 재개하고 생성기 함수에 값을 “전송”합니다. value 인수는 현재 yield 표현식의 결과가 됩니다. send() 메서드는 생성기가 생성한 다음 값을 반환하거나, 생성기가 다른 값을 생성하지 않고 종료하는 경우 StopIteration을 발생시킵니다. 제너레이터를 시작하기 위해 send()를 호출할 때 값을 받을 수 있는 yield 표현식이 없기 때문에 None을 인수로 하여 호출해야 합니다.

generator.throw(value)
generator.throw(type[, value[, traceback]])

제너레이터가 일시 중지된 지점에서 예외를 발생시키고 제너레이터 함수가 생성한 다음 값을 반환합니다. 생성기가 다른 값을 생성하지 않고 종료하면 StopIteration 예외가 발생합니다. 생성기 함수가 전달된 예외를 포착하지 않거나 다른 예외를 발생시키면 해당 예외가 호출자에게 전파됩니다.

일반적인 사용에서 이것은 raise 키워드가 사용되는 방식과 유사한 단일 예외 인스턴스로 호출됩니다.

그러나 이전 버전과의 호환성을 위해 이전 버전 Python의 규칙에 따라 두 번째 서명이 지원됩니다. type 인수는 예외 클래스여야 하고 value는 예외 인스턴스여야 합니다. 값이 제공되지 않으면 유형 생성자가 호출되어 인스턴스를 가져옵니다. 트레이스백이 제공되면 예외에 설정됩니다. 그렇지 않으면 값에 저장된 기존 __traceback__ 속성이 지워질 수 있습니다.

generator.close()

생성기 함수가 일시 중지된 지점에서 GeneratorExit를 발생시킵니다. 그런 다음 제너레이터 함수가 정상적으로 종료하거나 이미 닫혀 있거나 GeneratorExit(예외를 포착하지 않음으로써)를 발생시키면 close가 호출자에게 반환됩니다. 생성기가 값을 생성하면 RuntimeError가 발생합니다. 생성기가 다른 예외를 발생시키면 호출자에게 전파됩니다. close()는 제너레이터가 예외 또는 정상적인 종료로 인해 이미 종료된 경우 아무 작업도 수행하지 않습니다.

6.2.9.2. Examples

다음은 제너레이터와 제너레이터 함수의 동작을 보여주는 간단한 예입니다.

>>> def echo(value=None):
...     print("Execution starts when 'next()' is called for the first time.")
...     try:
...         while True:
...             try:
...                 value = (yield value)
...             except Exception as e:
...                 value = e
...     finally:
...         print("Don't forget to clean up when 'close()' is called.")
... 
>>> generator = echo(1)
>>> print(next(generator))
... Execution starts when 'next()' is called for the first time.
... 1
>>> print(next(generator))
... None
>>> print(generator.send(2))
... 2
>>> generator.throw(TypeError, "spam")
... TypeError('spam',)
>>> generator.close()
... Don't forget to clean up when 'close()' is called.

yield from을 사용하는 예는 “Python의 새로운 기능”에서 PEP 380: 하위 생성기에 위임하는 구문을 참조하세요.

6.2.9.3. Asynchronous generator functions

async def를 사용하여 정의된 함수 또는 메서드에 yield 표현식이 있으면 함수를 비동기 생성기 함수로 추가로 정의합니다.

비동기 제너레이터 함수가 호출되면 비동기 제너레이터 객체로 알려진 비동기 이터레이터를 반환합니다. 그런 다음 해당 개체는 생성기 함수의 실행을 제어합니다. 비동기 제너레이터 객체는 일반적으로 제너레이터 객체가 for 문에서 사용되는 방식과 유사하게 코루틴 함수의 async for 문에서 사용됩니다.

비동기 생성기의 메서드 중 하나를 호출하면 어웨이터블 객체가 반환되고 이 객체가 어웨이트되면 실행이 시작됩니다. 이때 실행은 첫 번째 yield 표현식으로 진행되며 여기서 다시 일시 중단되어 대기 중인 코루틴에 expression_list 값을 반환합니다. 제너레이터와 마찬가지로 일시 중단은 로컬 변수의 현재 바인딩, 명령 포인터, 내부 평가 스택 및 모든 예외 처리 상태를 포함하여 모든 로컬 상태가 유지됨을 의미합니다. 비동기 생성기의 메서드가 반환한 다음 개체를 기다리면서 실행이 재개되면 함수는 yield 표현식이 또 다른 외부 호출인 것처럼 정확하게 진행할 수 있습니다. 재개 후 yield 표현식의 값은 실행을 재개한 메서드에 따라 다릅니다. __anext__()가 사용되면 결과는 None입니다. 그렇지 않고 asend()가 사용되면 결과는 해당 메서드에 전달된 값이 됩니다.

비동기 제너레이터가 중단, 호출자 작업 취소 또는 기타 예외로 인해 조기에 종료되는 경우, 제너레이터의 비동기 정리 코드가 실행되어 예상하지 못한 컨텍스트에서 예외를 발생시키거나 컨텍스트 변수에 액세스할 수 있습니다. 또는 async-generator 가비지 수집 후크가 호출될 때 이벤트 루프가 종료되는 동안. 이를 방지하려면 호출자는 aclose() 메서드를 호출하여 생성기를 종료하고 궁극적으로 이벤트 루프에서 분리함으로써 비동기 생성기를 명시적으로 닫아야 합니다.

비동기 생성기 함수에서 yield 표현식은 try 구성의 모든 위치에서 허용됩니다. 그러나 비동기 생성기가 완료되기 전에 재개되지 않으면(0 참조 횟수에 도달하거나 가비지 수집됨) try 구문 내의 yield 표현식이 보류 중인 finally 절을 실행하지 못할 수 있습니다. 이 경우 비동기 제너레이터를 실행하는 이벤트 루프 또는 스케줄러는 비동기 제너레이터-이터레이터의 aclose() 메서드를 호출하고 결과 코루틴 객체를 실행하여 보류 중인 모든 finally 절을 실행할 수 있도록 합니다.

이벤트 루프 종료 시 종료를 처리하려면 이벤트 루프는 비동기 생성기 반복자를 사용하고 아마도 aclose()를 호출하고 코루틴을 실행하는 종료자 함수를 정의해야 합니다. 이 파이널라이저는 sys.set_asyncgen_hooks()를 호출하여 등록할 수 있습니다. 처음 반복할 때 비동기 생성기 반복자는 종료 시 호출할 등록된 종료자를 저장합니다. 종료자 메서드의 참조 예제는 Lib/asyncio/base_events.py에서 asyncio.Loop.shutdown_asyncgens 구현을 참조하세요.

의 yield 표현식은 비동기 생성기 함수에서 사용될 때 구문 오류입니다.

6.2.9.4. Asynchronous generator-iterator methods

이 하위 섹션에서는 생성기 함수의 실행을 제어하는 데 사용되는 비동기 생성기 반복자의 메서드를 설명합니다.

coroutine agen.__anext__()

run이 비동기 생성기를 실행하기 시작하거나 마지막으로 실행된 yield 표현식에서 다시 시작하는 awaitable을 반환합니다. 비동기 생성기 함수가 __anext__() 메서드로 재개되면 현재 yield 표현식은 반환된 awaitable에서 항상 None으로 평가되며, 실행 시 다음 yield 표현식으로 계속됩니다. yield 표현식의 expression_list 값은 완료 코루틴에 의해 발생한 StopIteration 예외 값입니다. 비동기 제너레이터가 다른 값을 생성하지 않고 종료되면 awaitable은 대신 StopAsyncIteration 예외를 발생시켜 비동기 반복이 완료되었음을 알립니다.

이 메서드는 일반적으로 async for 루프에 의해 암시적으로 호출됩니다.

coroutine agen.asend(value)

실행 시 비동기 생성기의 실행을 재개하는 어웨이터블을 반환합니다. 제너레이터의 send() 메서드와 마찬가지로 비동기 제너레이터 함수로 값을 “보내고” value 인수는 현재 yield 표현식의 결과가 됩니다. asend() 메서드에 의해 반환된 어웨이터블은 발생한 StopIteration의 값으로 생성기가 생성한 다음 값을 반환하거나, 비동기 생성기가 다른 값을 생성하지 않고 종료하는 경우 StopAsyncIteration을 발생시킵니다. 비동기 생성기를 시작하기 위해 asend()를 호출할 때 값을 받을 수 있는 yield 표현식이 없기 때문에 None을 인수로 사용하여 호출해야 합니다.

coroutine agen.athrow(type[, value[, traceback]])

비동기 제너레이터가 일시 중지된 지점에서 유형 유형의 예외를 발생시키는 어웨이터블을 반환하고 발생한 StopIteration 예외의 값으로 생성기 함수가 생성한 다음 값을 반환합니다. 비동기 제너레이터가 다른 값을 생성하지 않고 종료되면 StopAsyncIteration 예외가 awaitable에 의해 발생합니다. 생성기 함수가 전달된 예외를 포착하지 않거나 다른 예외를 발생시키는 경우 awaitable이 실행될 때 해당 예외가 awaitable의 호출자에게 전파됩니다.

coroutine agen.aclose()

실행 시 일시 중지된 지점에서 비동기 제너레이터 함수로 GeneratorExit를 발생시키는 어웨이터블을 반환합니다. 비동기 제너레이터 함수가 정상적으로 종료하거나 이미 닫혀 있거나 GeneratorExit를 발생시키면(예외를 포착하지 않음으로써) 반환된 어웨이터블이 StopIteration 예외를 발생시킵니다. 비동기 생성기에 대한 후속 호출에서 반환된 추가 대기 가능 항목은 StopAsyncIteration 예외를 발생시킵니다. 비동기 제너레이터가 값을 생성하면 awaitable에 의해 RuntimeError가 발생합니다. 비동기 제너레이터가 다른 예외를 발생시키면 어웨이터블 호출자에게 전파됩니다. 비동기 생성기가 예외 또는 정상적인 종료로 인해 이미 종료된 경우 aclose()에 대한 추가 호출은 아무 작업도 수행하지 않는 awaitable을 반환합니다.

6.3. Primaries

기본은 언어의 가장 밀접하게 바인딩된 작업을 나타냅니다. 구문은 다음과 같습니다.

primary ::=  atom | attributeref | subscription | slicing | call

6.3.1. Attribute references

속성 참조는 기본 뒤에 마침표와 이름이 오는 것입니다.

attributeref ::=  primary "." identifier

기본적으로 대부분의 객체가 수행하는 속성 참조를 지원하는 유형의 객체로 평가되어야 합니다. 그런 다음 이 객체는 이름이 식별자인 속성을 생성하도록 요청받습니다. 이 프로덕션은 __getattr__() 메서드를 재정의하여 사용자 정의할 수 있습니다. 이 속성을 사용할 수 없으면 AttributeError 예외가 발생합니다. 그렇지 않으면 생성된 개체의 유형과 값이 개체에 의해 결정됩니다. 동일한 속성 참조를 여러 번 평가하면 다른 개체가 생성될 수 있습니다.

6.3.2. Subscriptions

컨테이너 클래스 인스턴스의 구독은 일반적으로 컨테이너에서 요소를 선택합니다. 제네릭 클래스의 구독은 일반적으로 GenericAlias 개체를 반환합니다.

subscription ::=  primary "[" expression_list "]"

객체가 아래 첨자일 때 인터프리터는 기본 및 표현식 목록을 평가합니다.

기본은 구독을 지원하는 개체로 평가되어야 합니다. 객체는 __getitem__() 및 __class_getitem__() 중 하나 또는 둘 다를 정의하여 구독을 지원할 수 있습니다. 기본이 아래 첨자인 경우 식 목록의 평가 결과가 이러한 메서드 중 하나로 전달됩니다. __getitem__ 대신 __class_getitem__이 호출되는 경우에 대한 자세한 내용은 __class_getitem__ 대 __getitem__을 참조하십시오.

식 목록에 하나 이상의 쉼표가 포함되어 있으면 식 목록의 항목을 포함하는 튜플로 평가됩니다. 그렇지 않으면 표현식 목록은 목록의 유일한 구성원 값으로 평가됩니다.

내장 객체의 경우 __getitem__()을 통해 구독을 지원하는 두 가지 유형의 객체가 있습니다:

  1. Mappings. 기본이 매핑인 경우 식 목록은 값이 매핑의 키 중 하나인 개체로 평가되어야 하며 구독은 해당 키에 해당하는 매핑의 값을 선택합니다. 내장 매핑 클래스의 예는 dict 클래스입니다.
  2. Sequences. 기본이 시퀀스인 경우 식 목록은 int 또는 슬라이스로 평가되어야 합니다(다음 섹션에서 설명). 내장 시퀀스 클래스의 예로는 str, list 및 tuple 클래스가 있습니다.

공식 구문은 시퀀스의 음수 인덱스에 대해 특별한 규정을 만들지 않습니다. 그러나 내장 시퀀스는 모두 예를 들어 x[-1]이 x의 마지막 항목을 선택하도록 인덱스에 시퀀스의 길이를 추가하여 음수 인덱스를 해석하는 __getitem__() 메서드를 제공합니다. 결과 값은 시퀀스의 항목 수보다 작은 음이 아닌 정수여야 하며 구독은 색인이 해당 값(0부터 계산)인 항목을 선택합니다. 음수 인덱스 및 슬라이싱에 대한 지원은 객체의 __getitem__() 메서드에서 발생하므로 이 메서드를 재정의하는 하위 클래스는 해당 지원을 명시적으로 추가해야 합니다.

문자열은 항목이 문자인 특별한 종류의 시퀀스입니다. 문자는 별도의 데이터 유형이 아니라 정확히 한 문자의 문자열입니다.

6.3.3. Slicings

슬라이싱은 시퀀스 객체(예: 문자열, 튜플 또는 목록)의 항목 범위를 선택합니다. 슬라이싱은 식으로 사용되거나 대입문 또는 del 문에서 대상으로 사용될 수 있습니다. 슬라이싱 구문:

slicing      ::=  primary "[" slice_list "]"
slice_list   ::=  slice_item ("," slice_item)* [","]
slice_item   ::=  expression | proper_slice
proper_slice ::=  [lower_bound] ":" [upper_bound] [ ":" [stride] ]
lower_bound  ::=  expression
upper_bound  ::=  expression
stride       ::=  expression

여기에는 공식 구문에 모호성이 있습니다. 표현식 목록처럼 보이는 모든 것이 슬라이스 목록처럼 보이기 때문에 모든 구독은 슬라이싱으로 해석될 수 있습니다. 구문을 더 복잡하게 만드는 대신, 이 경우 구독으로 해석하는 것이 슬라이싱으로 해석하는 것보다 우선한다고 정의함으로써 모호함이 해소됩니다(이는 슬라이스 목록에 적절한 슬라이스가 포함되지 않는 경우입니다).

슬라이싱의 의미 체계는 다음과 같습니다. 기본은 다음과 같이 슬라이스 목록에서 생성된 키로 인덱싱됩니다(일반 구독과 동일한 __getitem__() 메서드 사용). 조각 목록에 하나 이상의 쉼표가 포함된 경우 키는 조각 항목의 변환을 포함하는 튜플입니다. 그렇지 않으면 단일 조각 항목의 변환이 핵심입니다. 식인 조각 항목의 변환이 해당 식입니다. 적절한 슬라이스의 변환은 슬라이스 객체(표준 유형 계층 섹션 참조)이며 그의 시작, 중지 및 단계 속성은 각각 하한, 상한 및 보폭으로 지정된 표현식의 값이며 누락된 표현식을 None으로 대체합니다.

6.3.4. Calls

호출은 아마도 비어 있는 일련의 인수를 사용하여 호출 가능한 객체(예: 함수)를 호출합니다.

call                 ::=  primary "(" [argument_list [","] | comprehension] ")"
argument_list        ::=  positional_arguments ["," starred_and_keywords]
                            ["," keywords_arguments]
                          | starred_and_keywords ["," keywords_arguments]
                          | keywords_arguments
positional_arguments ::=  positional_item ("," positional_item)*
positional_item      ::=  assignment_expression | "*" expression
starred_and_keywords ::=  ("*" expression | keyword_item)
                          ("," "*" expression | "," keyword_item)*
keywords_arguments   ::=  (keyword_item | "**" expression)
                          ("," keyword_item | "," "**" expression)*
keyword_item         ::=  identifier "=" expression

선택적 후행 쉼표는 위치 및 키워드 인수 뒤에 나타날 수 있지만 의미 체계에는 영향을 미치지 않습니다.

기본은 호출 가능한 객체로 평가되어야 합니다(사용자 정의 함수, 내장 함수, 내장 객체의 메서드, 클래스 객체, 클래스 인스턴스의 메서드 및 __call__() 메서드가 있는 모든 객체는 호출 가능합니다). 호출이 시도되기 전에 모든 인수 표현식이 평가됩니다. 공식 매개변수 목록의 구문은 함수 정의 섹션을 참조하십시오.

키워드 인수가 있으면 먼저 다음과 같이 위치 인수로 변환됩니다. 먼저 정규 매개변수에 대해 채워지지 않은 슬롯 목록이 생성됩니다. N개의 위치 인수가 있는 경우 첫 번째 N개의 슬롯에 배치됩니다. 다음으로 각 키워드 인수에 대해 식별자를 사용하여 해당 슬롯을 결정합니다(식별자가 첫 번째 형식 매개변수 이름과 동일한 경우 첫 번째 슬롯이 사용되는 식). 슬롯이 이미 채워져 있으면 TypeError 예외가 발생합니다. 그렇지 않으면 인수가 슬롯에 배치되어 슬롯을 채웁니다(표현식이 None인 경우에도 슬롯을 채웁니다). 모든 인수가 처리되면 아직 채워지지 않은 슬롯이 함수 정의의 해당 기본값으로 채워집니다. (디폴트는 함수가 정의될 때 한 번 계산되므로 리스트나 딕셔너리와 같은 가변 객체가 디폴트 값으로 사용되면 해당 슬롯에 대한 인수 값을 지정하지 않는 모든 호출이 공유하게 됩니다. 일반적으로 피해야 합니다.) 기본값이 지정되지 않은 채워지지 않은 슬롯이 있으면 TypeError 예외가 발생합니다. 그렇지 않으면 채워진 슬롯 목록이 호출의 인수 목록으로 사용됩니다.

CPython 구현 세부 정보: 구현은 위치 매개변수에 이름이 없는 내장 함수를 제공할 수 있습니다. 문서화 목적으로 ‘이름이 지정’되어 키워드로 제공될 수 없는 경우에도 마찬가지입니다. CPython에서 이는 인수를 구문 분석하기 위해 PyArg_ParseTuple()을 사용하는 C로 구현된 함수의 경우입니다.

형식 매개변수 슬롯보다 더 많은 위치 인수가 있는 경우 *identifier 구문을 사용하는 형식 매개변수가 존재하지 않는 한 TypeError 예외가 발생합니다. 이 경우 형식 매개변수는 초과 위치 인수를 포함하는 튜플(또는 초과 위치 인수가 없는 경우 빈 튜플)을 받습니다.

키워드 인수가 공식 매개변수 이름에 해당하지 않는 경우 **식별자 구문을 사용하는 공식 매개변수가 존재하지 않는 한 TypeError 예외가 발생합니다. 이 경우 형식 매개변수는 초과 키워드 인수(키워드를 키로 사용하고 인수 값을 해당 값으로 사용)를 포함하는 사전을 수신하거나 초과 키워드 인수가 없는 경우 (새) 빈 사전을 수신합니다.

구문 *expression이 함수 호출에 나타나면 expression은 iterable로 평가되어야 합니다. 이러한 iterable의 요소는 추가 위치 인수인 것처럼 처리됩니다. 호출 f(x1, x2, *y, x3, x4)의 경우 y가 시퀀스 y1, …, yM으로 평가되면 이는 M+4 위치 인수 x1, x2, y1, …, yM을 사용한 호출과 동일합니다. , x3, x4.

그 결과 *expression 구문이 명시적 키워드 인수 뒤에 나타날 수 있지만 키워드 인수(및 **expression 인수 – 아래 참조)보다 먼저 처리됩니다. 그래서:

>>> def f(a, b):
...     print(a, b)
... 
>>> f(b=1, *(2,))
2 1
>>> f(a=1, *(2,))
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
TypeError: f() got multiple values for keyword argument 'a'
>>> f(1, *(2,))
1 2

키워드 인수와 *expression 구문이 동일한 호출에서 사용되는 경우는 드문 일이므로 실제로는 이러한 혼동이 자주 발생하지 않습니다.

구문 **expression이 함수 호출에 나타나면 expression은 매핑으로 평가되어야 하며 그 내용은 추가 키워드 인수로 처리됩니다. 키와 일치하는 매개변수에 이미 값이 주어진 경우(명시적 키워드 인수 또는 다른 압축 해제에서) TypeError 예외가 발생합니다.

**식을 사용하는 경우 이 매핑의 각 키는 문자열이어야 합니다. 매핑의 각 값은 이름이 키와 동일한 키워드 할당에 적합한 첫 번째 공식 매개변수에 할당됩니다. 키는 Python 식별자일 필요가 없습니다(예: “max-temp °F”는 허용되지만 선언할 수 있는 형식 매개변수와 일치하지 않음). 정식 매개변수와 일치하는 항목이 없으면 ** 매개변수에 의해 키-값 쌍이 수집됩니다. 일치하는 항목이 있거나 없으면 TypeError 예외가 발생합니다.

구문 *identifier 또는 **identifier를 사용하는 형식 매개변수는 위치 인수 슬롯이나 키워드 인수 이름으로 사용할 수 없습니다.

버전 3.5에서 변경: 함수 호출은 얼마든지 * 및 ** 압축 해제를 허용하고 위치 인수는 반복 가능한 압축 해제(*)를 따를 수 있으며 키워드 인수는 사전 압축 해제(**)를 따를 수 있습니다. 원래 PEP 448에서 제안했습니다.

예외가 발생하지 않는 한 호출은 항상 어떤 값을 반환합니다. None일 수 있습니다. 이 값이 계산되는 방식은 호출 가능 객체의 유형에 따라 다릅니다.

그렇다면—

사용자 정의 함수:
함수의 코드 블록이 실행되어 인수 목록에 전달됩니다. 코드 블록이 가장 먼저 하는 일은 공식 매개변수를 인수에 바인딩하는 것입니다. 이것은 함수 정의 섹션에 설명되어 있습니다. 코드 블록이 return 문을 실행할 때 함수 호출의 반환 값을 지정합니다.

내장 함수 또는 메소드:
결과는 통역사에게 달려 있습니다. 내장 함수 및 메소드에 대한 설명은 내장 함수를 참조하십시오.

클래스 개체:
해당 클래스의 새 인스턴스가 반환됩니다.

클래스 인스턴스 메서드:
호출의 인수 목록보다 하나 더 긴 인수 목록을 사용하여 해당 사용자 정의 함수가 호출됩니다. 인스턴스가 첫 번째 인수가 됩니다.

클래스 인스턴스:
클래스는 __call__() 메서드를 정의해야 합니다; 그러면 해당 메서드가 호출된 것과 같은 효과가 나타납니다.

6.4. Await expression

어웨이터블 객체에서 코루틴 실행을 일시 중단합니다. 코루틴 함수 내에서만 사용할 수 있습니다.

await_expr ::=  "await" primary

버전 3.5의 새로운 기능.

6.5. The power operator

멱 연산자는 왼쪽에 있는 단항 연산자보다 더 단단히 묶습니다. 오른쪽에 있는 단항 연산자보다 덜 밀접하게 바인딩됩니다. 구문은 다음과 같습니다.

power ::=  (await_expr | primary) ["**" u_expr]

따라서 괄호로 묶지 않은 거듭제곱 및 단항 연산자 시퀀스에서 연산자는 오른쪽에서 왼쪽으로 평가됩니다(피연산자에 대한 평가 순서를 제한하지 않음). -1**2는 -1이 됩니다.

거듭제곱 연산자는 내장 pow() 함수와 동일한 의미를 가지며, 두 개의 인수를 사용하여 호출할 때 왼쪽 인수를 오른쪽 인수의 거듭제곱으로 승산합니다. 숫자 인수는 먼저 공통 유형으로 변환되고 결과는 해당 유형입니다.

int 피연산자의 경우 결과는 두 번째 인수가 음수가 아닌 한 피연산자와 동일한 유형을 가집니다. 이 경우 모든 인수는 float로 변환되고 float 결과가 전달됩니다. 예를 들어 10**2는 100을 반환하지만 10**-2는 0.01을 반환합니다.

0.0을 음의 거듭제곱으로 올리면 ZeroDivisionError가 발생합니다. 음수를 분수 거듭제곱으로 올리면 복소수가 됩니다. (이전 버전에서는 ValueError가 발생했습니다.)

이 작업은 특별한 __pow__() 메서드를 사용하여 사용자 지정할 수 있습니다.

6.6. Unary arithmetic and bitwise operations

모든 단항 산술 및 비트 연산은 동일한 우선 순위를 갖습니다.

u_expr ::=  power | "-" u_expr | "+" u_expr | "~" u_expr

단항 -(빼기) 연산자는 숫자 인수의 부정을 산출합니다. 작업은 __neg__() 특수 메서드로 재정의할 수 있습니다.

단항 +(더하기) 연산자는 숫자 인수를 변경하지 않고 반환합니다. 작업은 __pos__() 특수 메서드로 재정의할 수 있습니다.

단항 ~(반전) 연산자는 정수 인수의 비트 반전을 산출합니다. x의 비트 반전은 -(x+1)로 정의됩니다. __invert__() 특수 메서드를 재정의하는 정수 또는 사용자 정의 객체에만 적용됩니다.

세 가지 경우 모두 인수에 적절한 유형이 없으면 TypeError 예외가 발생합니다.

6.7. Binary arithmetic operations

이진 산술 연산에는 기존의 우선 순위 수준이 있습니다. 이러한 작업 중 일부는 숫자가 아닌 특정 유형에도 적용됩니다. 전력 연산자를 제외하고 곱셈 연산자와 덧셈 연산자의 두 가지 수준만 있습니다.

m_expr ::=  u_expr | m_expr "*" u_expr | m_expr "@" m_expr |
            m_expr "//" u_expr | m_expr "/" u_expr |
            m_expr "%" u_expr
a_expr ::=  m_expr | a_expr "+" m_expr | a_expr "-" m_expr

*(곱하기) 연산자는 인수의 곱을 산출합니다. 인수는 둘 다 숫자이거나 한 인수는 정수이고 다른 인수는 시퀀스여야 합니다. 전자의 경우 숫자를 공통 유형으로 변환한 다음 함께 곱합니다. 후자의 경우 시퀀스 반복이 수행됩니다. 음수 반복 요소는 빈 시퀀스를 생성합니다.

이 작업은 특별한 __mul__() 및 __rmul__() 메서드를 사용하여 사용자 지정할 수 있습니다.

@(at) 연산자는 행렬 곱셈에 사용하기 위한 것입니다. 어떤 내장 Python 유형도 이 연산자를 구현하지 않습니다.

버전 3.5의 새로운 기능.

/(나누기) 및 //(바닥 나눗셈) 연산자는 인수의 몫을 산출합니다. 숫자 인수는 먼저 공통 유형으로 변환됩니다. 정수를 나누면 부동 소수점이 생성되는 반면, 정수를 나누면 정수가 됩니다. 결과는 결과에 적용된 ‘floor’ 함수를 사용한 수학적 나눗셈의 결과입니다. 0으로 나누면 ZeroDivisionError 예외가 발생합니다.

이 작업은 특별한 __truediv__() 및 __floordiv__() 메서드를 사용하여 사용자 지정할 수 있습니다.

%(모듈로) 연산자는 첫 번째 인수를 두 번째 인수로 나눈 나머지를 산출합니다. 숫자 인수는 먼저 공통 유형으로 변환됩니다. 제로 오른쪽 인수는 ZeroDivisionError 예외를 발생시킵니다. 인수는 부동 소수점 숫자일 수 있습니다. 예를 들어 3.14%0.7은 0.34입니다(3.14는 4*0.7 + 0.34이므로). 결과의 절대값은 두 번째 피연산자 1의 절대값보다 엄격하게 작습니다.

바닥 나눗셈과 모듈로 연산자는 다음 항등식으로 연결됩니다. x == (x//y)*y + (x%y). 바닥 나눗셈과 모듈로는 내장 함수 divmod()와도 연결됩니다: divmod(x, y) == (x//y, x%y). 2.

숫자에 대해 모듈로 연산을 수행하는 것 외에도 % 연산자는 문자열 개체에 의해 오버로드되어 구식 문자열 서식 지정(보간이라고도 함)을 수행합니다. 문자열 포매팅 구문은 Python Library Reference, 섹션 printf-style String Formatting에 설명되어 있습니다.

모듈로 연산은 특별한 __mod__() 메서드를 사용하여 사용자 정의할 수 있습니다.

바닥 나누기 연산자, 모듈로 연산자 및 divmod() 함수는 복소수에 대해 정의되지 않습니다. 대신 적절한 경우 abs() 함수를 사용하여 부동 소수점 숫자로 변환합니다.

+(더하기) 연산자는 해당 인수의 합계를 산출합니다. 인수는 둘 다 숫자이거나 동일한 유형의 시퀀스여야 합니다. 전자의 경우 숫자를 공통 유형으로 변환한 다음 함께 더합니다. 후자의 경우 시퀀스가 연결됩니다.

이 작업은 특별한 __add__() 및 __radd__() 메서드를 사용하여 사용자 지정할 수 있습니다.

-(빼기) 연산자는 인수의 차이를 산출합니다. 숫자 인수는 먼저 공통 유형으로 변환됩니다.

이 작업은 특별한 __sub__() 메서드를 사용하여 사용자 정의할 수 있습니다.

6.8. Shifting operations

이동 연산은 산술 연산보다 우선 순위가 낮습니다.

shift_expr ::=  a_expr | shift_expr ("<<" | ">>") a_expr

이러한 연산자는 정수를 인수로 허용합니다. 첫 번째 인수를 두 번째 인수에서 지정한 비트 수만큼 왼쪽 또는 오른쪽으로 이동합니다.

이 작업은 특별한 __lshift__() 및 __rshift__() 메서드를 사용하여 사용자 지정할 수 있습니다.

n비트 오른쪽 시프트는 pow(2,n)에 의한 플로어 분할로 정의됩니다. n 비트 왼쪽 시프트는 pow(2,n)과의 곱셈으로 정의됩니다.

6.9. Binary bitwise operations

세 가지 비트 연산은 각각 다른 우선 순위 수준을 갖습니다.

and_expr ::=  shift_expr | and_expr "&" shift_expr
xor_expr ::=  and_expr | xor_expr "^" and_expr
or_expr  ::=  xor_expr | or_expr "|" xor_expr

& 연산자는 인수의 비트별 AND를 생성하며, 이는 정수이거나 그 중 하나가 __and__() 또는 __rand__() 특수 메서드를 재정의하는 사용자 정의 객체여야 합니다.

^ 연산자는 정수이거나 그 중 하나가 __xor__() 또는 __rxor__() 특수 메서드를 재정의하는 사용자 정의 객체여야 하는 인수의 비트별 XOR(배타적 OR)을 생성합니다.

| 연산자는 정수이거나 그 중 하나가 __or__() 또는 __ror__() 특수 메서드를 재정의하는 사용자 정의 객체여야 하는 인수의 비트별(포함) OR을 생성합니다.

6.10. Comparisons

C와 달리 Python의 모든 비교 연산은 동일한 우선 순위를 가지므로 산술, 이동 또는 비트 연산보다 낮습니다. 또한 C와 달리 a < b < c와 같은 표현은 수학에서 관습적으로 해석됩니다.

comparison    ::=  or_expr (comp_operator or_expr)*
comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "!="
                   | "is" ["not"] | ["not"] "in"

비교 결과 부울 값(True 또는 False)이 생성됩니다. 사용자 지정 풍부한 비교 메서드는 부울이 아닌 값을 반환할 수 있습니다. 이 경우 Python은 부울 컨텍스트에서 해당 값에 대해 bool()을 호출합니다.

비교는 임의로 연결될 수 있습니다. 예를 들어 x < y <= z는 x < y 및 y <= z와 동일합니다. 단, y는 한 번만 평가됩니다(그러나 두 경우 모두 x < y가 발견될 때 z는 전혀 평가되지 않습니다) 거짓).

공식적으로 a, b, c, …, y, z가 표현식이고 op1, op2, …, opN이 비교 연산자인 경우 a op1 b op2 c … y opN z는 a op1 b 및 b op2 c와 동일합니다. 및 … y opN z, 단, 각 표현식은 최대 한 번만 평가됩니다.

a op1 b op2 c는 a와 c 사이의 어떤 종류의 비교도 의미하지 않으므로 예를 들어 x < y > z는 완벽하게 합법적입니다(예쁘지는 않지만).

6.10.1. Value comparisons

<, >, ==, >=, <= 및 != 연산자는 두 개체의 값을 비교합니다. 개체의 유형이 같을 필요는 없습니다.

개체, 값 및 유형 장에서는 개체에 값(유형 및 ID 외에)이 있음을 설명합니다. 객체의 값은 Python에서 다소 추상적인 개념입니다. 예를 들어 객체 값에 대한 표준 액세스 방법이 없습니다. 또한 객체의 값이 특정 방식으로 구성되어야 한다는 요구 사항도 없습니다. 모든 데이터 속성으로 구성됩니다. 비교 연산자는 개체의 값이 무엇인지에 대한 특정 개념을 구현합니다. 비교 구현을 통해 객체의 값을 간접적으로 정의하는 것으로 생각할 수 있습니다.

모든 유형은 object의 (직접 또는 간접) 하위 유형이므로 object에서 기본 비교 동작을 상속합니다. 유형은 기본 사용자 지정에 설명된 __lt__()와 같은 풍부한 비교 메서드를 구현하여 비교 동작을 사용자 지정할 수 있습니다.

같음 비교(== 및 !=)의 기본 동작은 개체의 ID를 기반으로 합니다. 따라서 동일한 ID를 가진 인스턴스의 동등 비교는 동등 결과를 낳고, 다른 ID를 가진 인스턴스의 동등 비교는 불평등 결과를 낳습니다. 이 기본 동작의 동기는 모든 객체가 반사적이어야 한다는 욕구입니다(즉, x는 y는 x == y를 암시합니다).

기본 순서 비교(<, >, <= 및 >=)는 제공되지 않습니다. 시도하면 TypeError가 발생합니다. 이 기본 동작에 대한 동기는 평등과 유사한 불변성이 부족하기 때문입니다.

서로 다른 ID를 가진 인스턴스가 항상 같지 않은 기본 같음 비교의 동작은 개체 값 및 값 기반 같음에 대한 합리적인 정의가 필요한 유형과 대조될 수 있습니다. 이러한 유형은 비교 동작을 사용자 정의해야 하며 실제로 많은 기본 제공 유형이 이를 수행했습니다.

다음 목록은 가장 중요한 기본 제공 유형의 비교 동작을 설명합니다.

  • 기본 제공 숫자 유형(숫자 유형 – int, float, complex) 및 표준 라이브러리 유형 fractions.Fraction 및 decimal.Decimal의 숫자는 복소수가 순서 비교를 지원하지 않는다는 제한과 함께 유형 내에서 또는 유형 간에 비교할 수 있습니다. . 관련된 유형의 한계 내에서 정밀도 손실 없이 수학적으로(알고리즘적으로) 올바른지 비교합니다.

    숫자가 아닌 값 float(‘NaN’) 및 decimal.Decimal(‘NaN’)은 특별합니다. 숫자와 숫자가 아닌 값의 순서 비교는 거짓입니다. 직관적이지 않은 의미는 숫자가 아닌 값이 자신과 같지 않다는 것입니다. 예를 들어 x = float(‘NaN’)인 경우 3 < x, x < 3 및 x == x는 모두 거짓이고 x != x는 참입니다. 이 동작은 IEEE 754를 준수합니다.
  • None 및 NotImplemented는 싱글톤입니다. PEP 8은 싱글톤에 대한 비교는 항상 is 또는 is not으로 수행되어야 하며 결코 등호 연산자로 수행되어야 한다고 조언합니다.
  • 이진 시퀀스(bytes 또는 bytearray의 인스턴스)는 유형 내에서 그리고 유형 간에 비교할 수 있습니다. 요소의 숫자 값을 사용하여 사전순으로 비교합니다.
  • 문자열(str의 인스턴스)은 해당 문자의 숫자 유니코드 코드 포인트(내장 함수 ord()의 결과)를 사용하여 사전순으로 비교합니다. 삼
  • 문자열과 이진 시퀀스는 직접 비교할 수 없습니다.
  • 시퀀스(튜플, 목록 또는 범위의 인스턴스)는 각 유형 내에서만 비교할 수 있으며 범위는 순서 비교를 지원하지 않는다는 제한이 있습니다. 이러한 유형에 대한 동등 비교는 불평등을 초래하고 이러한 유형에 대한 순서 비교는 TypeError를 발생시킵니다.

    시퀀스는 해당 요소의 비교를 사용하여 사전순으로 비교합니다. 기본 제공 컨테이너는 일반적으로 동일한 개체가 자신과 동일하다고 가정합니다. 이를 통해 성능을 개선하고 내부 불변성을 유지하기 위해 동일한 개체에 대한 동등성 테스트를 우회할 수 있습니다.

    기본 제공 컬렉션 간의 사전식 비교는 다음과 같이 작동합니다.
    • 두 컬렉션이 같다고 비교되려면 같은 유형이어야 하고 길이도 같아야 하며 해당 요소의 각 쌍은 같은 것으로 비교되어야 합니다(예: [1,2] == (1,2)는 false입니다. 동일하지 않습니다).
    • 순서 비교를 지원하는 컬렉션은 첫 번째 동일하지 않은 요소와 동일하게 정렬됩니다(예: [1,2,x] <= [1,2,y]는 x <= y와 동일한 값을 가짐). 해당 요소가 없으면 더 짧은 컬렉션이 먼저 정렬됩니다(예: [1,2] < [1,2,3]이 참임).
  • 매핑(dict의 인스턴스)은 동일한(키, 값) 쌍이 있는 경우에만 동일한 것으로 비교됩니다. 키와 값의 동등 비교는 반사성을 적용합니다.
  • 순서 비교(<, >, <= 및 >=)는 TypeError를 발생시킵니다.

    집합(set 또는 frozenset의 인스턴스)은 유형 내에서 또는 유형 간에 비교할 수 있습니다.

    하위 집합 및 상위 집합 테스트를 의미하는 순서 비교 연산자를 정의합니다. 이러한 관계는 전체 순서를 정의하지 않습니다(예를 들어, 두 집합 {1,2} 및 {2,3}은 동일하지 않으며, 서로의 하위 집합도, 서로의 상위 집합도 아닙니다). 따라서 집합은 전체 순서에 의존하는 함수에 대한 적절한 인수가 아닙니다(예를 들어 min(), max() 및 sorted()는 입력으로 집합 목록이 주어지면 정의되지 않은 결과를 생성함).

    세트 비교는 해당 요소의 반사성을 강화합니다.
  • 대부분의 다른 기본 제공 유형에는 구현된 비교 메서드가 없으므로 기본 비교 동작을 상속합니다.

비교 동작을 사용자 지정하는 사용자 정의 클래스는 가능한 경우 몇 가지 일관성 규칙을 따라야 합니다.

  • 평등 비교는 반사적이어야 합니다. 즉, 동일한 객체는 동등하게 비교되어야 합니다.
    x is yx == y를 의미합니다.
  • 비교는 대칭적이어야 합니다. 즉, 다음 표현식의 결과는 동일해야 합니다.
    x == yy == x
    x != yy != x
    x < yy > x
    x <= yy >= x
  • 비교는 전이적이어야 합니다. 다음(완전하지 않은) 예는 다음을 설명합니다.
    x > yy > zx > z를 의미합니다.
    x < yy <= zx < z를 의미합니다.
  • 역 비교 결과는 부울 부정이어야 합니다. 즉, 다음 표현식의 결과는 동일해야 합니다.
    x == yx != y 아님
    x < yx >= y 아님(총 주문의 경우)
    x > yx <= y 아님(총 주문의 경우)
    마지막 두 표현식은 전체적으로 정렬된 컬렉션에 적용됩니다(예: 시퀀스에 적용되지만 세트나 매핑에는 적용되지 않음). total_ordering() 데코레이터도 참조하십시오.
  • hash() 결과는 동등성과 일치해야 합니다. 동일한 객체는 동일한 해시 값을 가지거나 해시 불가로 표시되어야 합니다.
  • Python은 이러한 일관성 규칙을 적용하지 않습니다. 실제로 숫자가 아닌 값은 이러한 규칙을 따르지 않는 예입니다.

Python은 이러한 일관성 규칙을 적용하지 않습니다. 실제로 숫자가 아닌 값은 이러한 규칙을 따르지 않는 예입니다.

6.10.2. Membership test operations

소속 여부를 테스트하는 연산자입니다. x in s는 x가 s의 구성원이면 True로 평가되고 그렇지 않으면 False로 평가됩니다. s에 없는 x는 s에 있는 x의 부정을 반환합니다. 모든 내장 시퀀스와 집합 유형은 사전뿐만 아니라 사전에 주어진 키가 있는지 여부를 테스트하는 사전을 지원합니다. list, tuple, set, frozenset, dict 또는 collections.deque와 같은 컨테이너 유형의 경우 x in y는 any(x is e 또는 x == e for e in y)와 동일합니다.

문자열 및 바이트 유형의 경우 y의 x는 x가 y의 하위 문자열인 경우에만 True입니다. 동등한 테스트는 y.find(x) != -1입니다. 빈 문자열은 항상 다른 문자열의 하위 문자열로 간주되므로 “abc”의 “”는 True를 반환합니다.

__contains__() 메서드를 정의하는 사용자 정의 클래스의 경우 y.__contains__(x)가 참 값을 반환하면 x in y는 True를 반환하고 그렇지 않으면 False를 반환합니다.

__contains__()를 정의하지 않지만 __iter__()를 정의하는 사용자 정의 클래스의 경우 x가 z이거나 x == z가 참인 일부 값 z가 y를 반복하는 동안 생성되는 경우 y의 x는 참입니다. . 반복 중에 예외가 발생하면 해당 예외가 발생한 것으로 간주됩니다.

마지막으로 이전 스타일의 반복 프로토콜이 시도됩니다. 클래스가 __getitem__()을 정의하는 경우 x가 y[i] 또는 x == y인 음이 아닌 정수 인덱스 i가 있는 경우에만 x in y는 True입니다. [i], 더 낮은 정수 인덱스가 없으면 IndexError 예외가 발생합니다. (다른 예외가 발생하면 해당 예외가 발생한 것과 같습니다.)

연산자 not in은 in의 역진실값을 갖도록 정의됩니다.

6.10.3. Identity comparisons

연산자는 개체의 ID를 테스트하거나 테스트하지 않습니다. x is y는 x와 y가 동일한 개체인 경우에만 참입니다. 객체의 ID는 id() 함수를 사용하여 결정됩니다. x is not y는 역 진리 값을 산출합니다.

6.11. Boolean operations

or_test  ::=  and_test | or_test "or" and_test
and_test ::=  not_test | and_test "and" not_test
not_test ::=  comparison | "not" not_test

부울 연산의 컨텍스트에서 그리고 제어 흐름 문에서 표현식을 사용하는 경우 다음 값은 false로 해석됩니다. False, None, 모든 유형의 숫자 0, 빈 문자열 및 컨테이너(문자열, 튜플, 목록, 사전 포함) , 세트 및 고정 세트). 다른 모든 값은 true로 해석됩니다. 사용자 정의 객체는 __bool__() 메서드를 제공하여 진리값을 사용자 정의할 수 있습니다.

연산자 not은 인수가 false이면 True를, 그렇지 않으면 False를 생성합니다.

x와 y 표현식은 먼저 x를 평가합니다. x가 false이면 해당 값이 반환됩니다. 그렇지 않으면 y가 평가되고 결과 값이 반환됩니다.

x 또는 y 표현식은 먼저 x를 평가합니다. x가 참이면 그 값이 반환됩니다. 그렇지 않으면 y가 평가되고 결과 값이 반환됩니다.

False 및 True로 반환하는 값과 유형을 제한하지 않고 마지막으로 평가된 인수를 반환합니다. 이것은 때때로 유용합니다. 예를 들어 s가 비어 있으면 기본값으로 대체되어야 하는 문자열인 경우 표현식 s 또는 ‘foo’는 원하는 값을 산출합니다. not은 새 값을 생성해야 하므로 인수 유형에 관계없이 부울 값을 반환합니다(예: not ‘foo’는 ”가 아닌 False를 생성합니다.).

6.12. Assignment expressions

assignment_expression ::=  [identifier ":="] expression

할당 식(“명명된 식” 또는 “바다코끼리”라고도 함)은 식별자에 식을 할당하는 동시에 식 값을 반환합니다.

일반적인 사용 사례 중 하나는 일치하는 정규식을 처리하는 경우입니다.

if matching := pattern.search(data):
    do_something(matching)

또는 청크로 파일 스트림을 처리할 때:

while chunk := file.read(9000):
    process(chunk)

슬라이싱, 조건부, 람다, 키워드-인수 및 이해-if 식과 assert 및 with 문에서 하위 식으로 사용될 때 대입 식을 괄호로 묶어야 합니다. if 및 while 문을 포함하여 사용할 수 있는 다른 모든 위치에서는 괄호가 필요하지 않습니다.

버전 3.8의 새로운 기능: 할당 표현식에 대한 자세한 내용은 PEP 572를 참조하세요.

6.13. Conditional expressions

conditional_expression ::=  or_test ["if" or_test "else" expression]
expression             ::=  conditional_expression | lambda_expr

조건식(“삼항 연산자”라고도 함)은 모든 Python 연산 중에서 우선 순위가 가장 낮습니다.

x if C else y 표현식은 x가 아닌 C라는 조건을 먼저 평가합니다. C가 참이면 x가 평가되고 그 값이 반환됩니다. 그렇지 않으면 y가 평가되고 해당 값이 반환됩니다.

조건식에 대한 자세한 내용은 PEP 308을 참조하십시오.

6.14. Lambdas

lambda_expr ::=  "lambda" [parameter_list] ":" expression

람다 식(람다 형식이라고도 함)은 익명 함수를 만드는 데 사용됩니다. 표현식 lambda parameters: expression은 함수 객체를 생성합니다. 명명되지 않은 개체는 다음으로 정의된 함수 개체처럼 동작합니다.

def <lambda>(parameters):
    return expression

매개변수 목록의 구문에 대한 함수 정의 섹션을 참조하십시오. 람다 식으로 만든 함수는 문이나 주석을 포함할 수 없습니다.

6.15. Expression lists

expression_list    ::=  expression ("," expression)* [","]
starred_list       ::=  starred_item ("," starred_item)* [","]
starred_expression ::=  expression | (starred_item ",")* [starred_item]
starred_item       ::=  assignment_expression | "*" or_expr

목록 또는 세트 표시의 일부인 경우를 제외하고 하나 이상의 쉼표를 포함하는 표현식 목록은 튜플을 생성합니다. 튜플의 길이는 목록에 있는 표현식의 수입니다. 표현식은 왼쪽에서 오른쪽으로 평가됩니다.

별표 *는 반복 가능한 압축 해제를 나타냅니다. 피연산자는 이터러블이어야 합니다. iterable은 언패킹 사이트에서 새 튜플, 목록 또는 집합에 포함되는 일련의 항목으로 확장됩니다.

버전 3.5의 새로운 기능: 원래 PEP 448에서 제안한 표현식 목록의 반복 가능한 압축 풀기.

후행 쉼표는 단일 튜플(a.k.a. 싱글톤)을 생성하는 데에만 필요합니다. 다른 모든 경우에는 선택 사항입니다. 후행 쉼표가 없는 단일 표현식은 튜플을 생성하지 않고 해당 표현식의 값을 생성합니다. (빈 튜플을 만들려면 빈 괄호 쌍을 사용합니다: ().)

6.16. Evaluation order

파이썬은 표현식을 왼쪽에서 오른쪽으로 평가합니다. 할당을 평가하는 동안 오른쪽이 왼쪽보다 먼저 평가됩니다.

다음 줄에서 식은 접미사의 산술 순서로 평가됩니다.

expr1, expr2, expr3, expr4
(expr1, expr2, expr3, expr4)
{expr1: expr2, expr3: expr4}
expr1 + expr2 * (expr3 - expr4)
expr1(expr2, expr3, *expr4, **expr5)
expr3, expr4 = expr1, expr2

6.17. Operator precedence

다음 표는 가장 높은 우선 순위(가장 높은 바인딩)에서 가장 낮은 우선 순위(최소 바인딩)까지 Python의 연산자 우선 순위를 요약한 것입니다. 같은 상자에 있는 연산자는 우선 순위가 같습니다. 구문이 명시적으로 제공되지 않는 한 연산자는 이진입니다. 동일한 상자 그룹의 연산자는 왼쪽에서 오른쪽으로 그룹화됩니다(오른쪽에서 왼쪽으로 그룹화되는 지수 및 조건식 제외).

비교, 멤버십 테스트 및 ID 테스트는 모두 동일한 우선 순위를 가지며 비교 섹션에 설명된 대로 왼쪽에서 오른쪽으로 연결 기능이 있습니다.

OperatorDescription
(expressions...),[expressions...]{key: value...}{expressions...}Binding or parenthesized expression, list display, dictionary display, set display
x[index]x[index:index]x(arguments...)x.attributeSubscription, slicing, call, attribute reference
await xAwait expression
**Exponentiation 5
+x-x~xPositive, negative, bitwise NOT
*@///%Multiplication, matrix multiplication, division, floor division, remainder 6
+-Addition and subtraction
<<>>Shifts
&Bitwise AND
^Bitwise XOR
|Bitwise OR
innot inisis not<<=>>=!===Comparisons, including membership tests and identity tests
not xBoolean NOT
andBoolean AND
orBoolean OR
if – elseConditional expression
lambdaLambda expression
:=Assignment expression

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

Python Language Reference > 5. The import system

한 모듈의 Python 코드는 가져오는 프로세스를 통해 다른 모듈의 코드에 액세스할 수 있습니다. import 문은 import 기계를 호출하는 가장 일반적인 방법이지만 유일한 방법은 아닙니다. importlib.import_module() 및 내장 __import__()와 같은 함수를 사용하여 가져오기 기계를 호출할 수도 있습니다.

import 문은 두 가지 작업을 결합합니다. 명명된 모듈을 검색한 다음 해당 검색 결과를 로컬 범위의 이름에 바인딩합니다. import 문의 검색 작업은 적절한 인수와 함께 __import__() 함수에 대한 호출로 정의됩니다. __import__()의 반환 값은 import 문의 이름 바인딩 작업을 수행하는 데 사용됩니다. 해당 이름 바인딩 작업에 대한 정확한 세부 정보는 import 문을 참조하십시오.

__import__() 에 대한 직접 호출은 모듈 검색과 모듈 생성 작업만 수행합니다. 부모 패키지 가져오기 및 다양한 캐시(sys.modules 포함) 업데이트와 같은 특정 부작용이 발생할 수 있지만 import 문만 이름 바인딩 작업을 수행합니다.

import 문이 실행되면 표준 내장 __import__() 함수가 호출됩니다. 가져오기 시스템을 호출하는 다른 메커니즘(예: importlib.import_module())은 __import__()를 우회하고 자체 솔루션을 사용하여 가져오기 의미 체계를 구현하도록 선택할 수 있습니다.

모듈을 처음 가져올 때 Python은 모듈을 검색하고 발견되면 모듈 객체 1을 생성하여 초기화합니다. 명명된 모듈을 찾을 수 없으면 ModuleNotFoundError가 발생합니다. Python은 가져오기 기계가 호출될 때 명명된 모듈을 검색하기 위한 다양한 전략을 구현합니다. 이러한 전략은 아래 섹션에 설명된 다양한 후크를 사용하여 수정하고 확장할 수 있습니다.

버전 3.3에서 변경: 가져오기 시스템이 PEP 302의 두 번째 단계를 완전히 구현하도록 업데이트되었습니다. 더 이상 암시적인 가져오기 기계가 없습니다. 전체 가져오기 시스템은 sys.meta_path를 통해 노출됩니다. 또한 기본 네임스페이스 패키지 지원이 구현되었습니다(PEP 420 참조).

5.1. importlib

importlib 모듈은 가져오기 시스템과 상호 작용하기 위한 풍부한 API를 제공합니다. 예를 들어 importlib.import_module()은 가져오기 기계를 호출하기 위해 내장된 __import__()보다 간단하고 권장되는 API를 제공합니다. 자세한 내용은 importlib 라이브러리 설명서를 참조하십시오.

5.2. Packages

파이썬에는 한 가지 유형의 모듈 객체만 있으며 모든 모듈은 모듈이 파이썬, C 또는 다른 것으로 구현되었는지 여부에 관계없이 이 유형입니다. 모듈 구성을 돕고 명명 계층 구조를 제공하기 위해 Python에는 패키지 개념이 있습니다.

패키지를 파일 시스템의 디렉토리로, 모듈을 디렉토리 내의 파일로 생각할 수 있지만 패키지와 모듈이 파일 시스템에서 생성될 필요가 없으므로 이 비유를 너무 문자 그대로 받아들이지 마십시오. 이 설명서의 목적을 위해 디렉터리와 파일의 편리한 비유를 사용합니다. 파일 시스템 디렉토리와 마찬가지로 패키지는 계층적으로 구성되며 패키지 자체에는 일반 모듈뿐만 아니라 하위 패키지가 포함될 수 있습니다.

모든 패키지는 모듈이지만 모든 모듈이 패키지는 아니라는 점을 기억하는 것이 중요합니다. 달리 말하면 패키지는 특별한 종류의 모듈일 뿐입니다. 특히 path 속성을 포함하는 모든 모듈은 패키지로 간주됩니다.

모든 모듈에는 이름이 있습니다. 하위 패키지 이름은 Python의 표준 속성 액세스 구문과 유사하게 점으로 상위 패키지 이름과 구분됩니다. 따라서 email이라는 패키지가 있을 수 있습니다. 이 패키지에는 email.mime이라는 하위 패키지와 email.mime.text라는 하위 패키지 내의 모듈이 있습니다.

5.2.1. Regular packages

Python은 일반 패키지와 네임스페이스 패키지의 두 가지 유형의 패키지를 정의합니다. 일반 패키지는 Python 3.2 및 이전 버전에 존재했던 전통적인 패키지입니다. 일반 패키지는 일반적으로 __init__.py 파일을 포함하는 디렉토리로 구현됩니다. 일반 패키지를 가져오면 이 __init__.py 파일이 암시적으로 실행되고 이 파일이 정의하는 개체는 패키지 네임스페이스의 이름에 바인딩됩니다. __init__.py 파일은 다른 모듈이 포함할 수 있는 것과 동일한 Python 코드를 포함할 수 있으며 Python은 모듈을 가져올 때 모듈에 몇 가지 추가 특성을 추가합니다.

예를 들어 다음 파일 시스템 레이아웃은 3개의 하위 패키지가 있는 최상위 상위 패키지를 정의합니다.

parent/
    __init__.py
    one/
        __init__.py
    two/
        __init__.py
    three/
        __init__.py

parent.one을 가져오면 암시적으로 parent/__init__.py 및 parent/one/__init__.py가 실행됩니다. 이후에 parent.two 또는 parent.three를 가져오면 각각 parent/two/__init__.py 및 parent/three/__init__.py가 실행됩니다.

5.2.2. Namespace packages

네임스페이스 패키지는 각 부분이 하위 패키지를 상위 패키지에 제공하는 다양한 부분의 합성물입니다. 부분은 파일 시스템의 다른 위치에 있을 수 있습니다. 일부는 zip 파일, 네트워크 또는 Python이 가져오는 동안 검색하는 다른 모든 곳에서 찾을 수 있습니다. 네임스페이스 패키지는 파일 시스템의 객체에 직접적으로 대응할 수도 있고 그렇지 않을 수도 있습니다. 구체적인 표현이 없는 가상 모듈일 수 있습니다.

네임스페이스 패키지는 __path__ 속성에 일반 목록을 사용하지 않습니다. 대신 부모 패키지의 경로(또는 최상위 패키지의 경우 sys.path)가 변경되는 경우 해당 패키지 내에서 다음 가져오기 시도에서 패키지 부분에 대한 새로운 검색을 자동으로 수행하는 사용자 정의 반복 가능 유형을 사용합니다.

네임스페이스 패키지에는 parent/__init__.py 파일이 없습니다. 실제로 가져오기 검색 중에 여러 개의 상위 디렉토리가 있을 수 있으며 각 디렉토리는 다른 부분에서 제공됩니다. 따라서 parent/one은 물리적으로 parent/two 옆에 위치하지 않을 수 있습니다. 이 경우 Python은 상위 패키지 또는 하위 패키지 중 하나를 가져올 때마다 최상위 상위 패키지에 대한 네임스페이스 패키지를 생성합니다.

네임스페이스 패키지 사양에 대해서는 PEP 420도 참조하십시오.

5.3. Searching

검색을 시작하려면 Python은 가져오는 모듈(또는 패키지, 그러나 이 논의의 목적상 그 차이는 중요하지 않음)의 정규화된 이름이 필요합니다. 이 이름은 import 문에 대한 다양한 인수에서 가져오거나 importlib.import_module() 또는 __import__() 함수에 대한 매개변수에서 가져올 수 있습니다.

이 이름은 가져오기 검색의 다양한 단계에서 사용되며 하위 모듈에 대한 점으로 구분된 경로일 수 있습니다. foo.bar.baz. 이 경우 Python은 먼저 foo, foo.bar, 마지막으로 foo.bar.baz를 가져오려고 시도합니다. 중간 가져오기 중 하나라도 실패하면 ModuleNotFoundError가 발생합니다.

5.3.1. The module cache

가져오기 검색 시 가장 먼저 확인하는 곳은 sys.modules입니다. 이 매핑은 중간 경로를 포함하여 이전에 가져온 모든 모듈의 캐시 역할을 합니다. 따라서 이전에 foo.bar.baz를 가져온 경우 sys.modules에는 foo, foo.bar 및 foo.bar.baz에 대한 항목이 포함됩니다. 각 키는 해당 모듈 개체의 값을 갖습니다.

가져오는 동안 모듈 이름은 sys.modules에서 조회되며, 있는 경우 관련 값은 가져오기를 충족하는 모듈이고 프로세스가 완료됩니다. 그러나 값이 None이면 ModuleNotFoundError가 발생합니다. 모듈 이름이 없으면 Python은 계속해서 모듈을 검색합니다.

sys.modules는 쓰기 가능합니다. 키를 삭제하면 연결된 모듈이 파괴되지 않을 수 있지만(다른 모듈이 키에 대한 참조를 보유할 수 있으므로) 명명된 모듈의 캐시 항목을 무효화하여 Python이 다음에 가져올 때 명명된 모듈을 새로 검색하게 합니다. 키를 None으로 할당하여 ModuleNotFoundError가 발생하도록 모듈을 다음에 가져올 수도 있습니다.

그러나 모듈 개체에 대한 참조를 유지하고 sys.modules에서 해당 캐시 항목을 무효화한 다음 명명된 모듈을 다시 가져오는 것처럼 두 모듈 개체는 동일하지 않습니다. 반대로 importlib.reload()는 동일한 모듈 객체를 재사용하고 모듈의 코드를 다시 실행하여 모듈 내용을 다시 초기화합니다.

5.3.2. Finders and loaders

명명된 모듈이 sys.modules에서 발견되지 않으면 Python의 가져오기 프로토콜이 호출되어 모듈을 찾아 로드합니다. 이 프로토콜은 두 개의 개념적 개체인 파인더와 로더로 구성됩니다. 파인더의 임무는 알고 있는 전략을 사용하여 명명된 모듈을 찾을 수 있는지 여부를 결정하는 것입니다. 이 두 인터페이스를 모두 구현하는 객체를 임포터라고 합니다. 요청된 모듈을 로드할 수 있음을 발견하면 자신을 반환합니다.

Python에는 여러 기본 파인더 및 임포터가 포함되어 있습니다. 첫 번째는 내장 모듈을 찾는 방법을 알고 있고 두 번째는 고정된 모듈을 찾는 방법을 알고 있습니다. 세 번째 기본 파인더는 모듈의 가져오기 경로를 검색합니다. 가져오기 경로는 파일 시스템 경로 또는 zip 파일의 이름을 지정할 수 있는 위치 목록입니다. URL로 식별되는 리소스와 같이 찾을 수 있는 모든 리소스를 검색하도록 확장할 수도 있습니다.

가져오기 기계는 확장 가능하므로 모듈 검색의 범위와 범위를 확장하기 위해 새 파인더를 추가할 수 있습니다.

파인더는 실제로 모듈을 로드하지 않습니다. 명명된 모듈을 찾을 수 있으면 모듈의 가져오기 관련 정보를 캡슐화한 모듈 사양을 반환합니다. 그러면 가져오기 기계가 모듈을 로드할 때 사용합니다.

다음 섹션에서는 가져오기 기계를 확장하기 위해 새 항목을 만들고 등록하는 방법을 포함하여 파인더 및 로더에 대한 프로토콜을 자세히 설명합니다.

버전 3.4에서 변경: 이전 버전의 Python에서는 파인더가 로더를 직접 반환했지만 이제 로더를 포함하는 모듈 사양을 반환합니다. 로더는 가져오기 중에 계속 사용되지만 책임이 적습니다.

5.3.3. Import hooks

가져오기 기계는 확장 가능하도록 설계되었습니다. 이에 대한 기본 메커니즘은 가져오기 후크입니다. 가져오기 후크에는 메타 후크와 가져오기 경로 후크의 두 가지 유형이 있습니다.

sys.modules 캐시 조회 이외의 다른 가져오기 처리가 발생하기 전에 가져오기 처리 시작 시 메타 후크가 호출됩니다. 이를 통해 메타 후크는 sys.path 처리, 고정 모듈 또는 내장 모듈을 재정의할 수 있습니다. 메타 후크는 아래 설명된 대로 sys.meta_path에 새 파인더 객체를 추가하여 등록됩니다.

가져오기 경로 후크는 연결된 경로 항목이 만나는 지점에서 sys.path(또는 package.path) 처리의 일부로 호출됩니다. 가져오기 경로 후크는 아래 설명된 대로 sys.path_hooks에 새 콜러블을 추가하여 등록됩니다.

5.3.4. The meta path

명명된 모듈이 sys.modules에서 발견되지 않으면 Python은 다음으로 메타 경로 찾기 개체 목록이 포함된 sys.meta_path를 검색합니다. 이러한 파인더는 명명된 모듈을 처리하는 방법을 알고 있는지 확인하기 위해 쿼리됩니다. 메타 경로 찾기는 이름, 가져오기 경로 및 대상 모듈(선택 사항)의 세 가지 인수를 사용하는 find_spec()이라는 메서드를 구현해야 합니다. 메타 경로 찾기는 명명된 모듈을 처리할 수 있는지 여부를 결정하기 위해 원하는 모든 전략을 사용할 수 있습니다.

메타 경로 찾기가 명명된 모듈을 처리하는 방법을 알고 있으면 사양 개체를 반환합니다. 명명된 모듈을 처리할 수 없으면 None을 반환합니다. sys.meta_path 처리가 사양을 반환하지 않고 목록 끝에 도달하면 ModuleNotFoundError가 발생합니다. 발생하는 다른 모든 예외는 단순히 전파되어 가져오기 프로세스를 중단합니다.

메타 경로 찾기의 find_spec() 메서드는 두 개 또는 세 개의 인수로 호출됩니다. 첫 번째는 가져올 모듈의 정규화된 이름입니다(예: foo.bar.baz). 두 번째 인수는 모듈 검색에 사용할 경로 항목입니다. 최상위 모듈의 경우 두 번째 인수는 None이지만 하위 모듈 또는 하위 패키지의 경우 두 번째 인수는 상위 패키지의 __path__ 속성 값입니다. 적절한 __path__ 속성에 액세스할 수 없으면 ModuleNotFoundError가 발생합니다. 세 번째 인수는 나중에 로드할 대상이 될 기존 모듈 개체입니다. 가져오기 시스템은 다시 로드하는 동안에만 대상 모듈을 전달합니다.

단일 가져오기 요청에 대해 메타 경로를 여러 번 통과할 수 있습니다. 예를 들어 관련된 모듈 중 어느 것도 이미 캐시되지 않았다고 가정하면 foo.bar.baz를 가져오면 먼저 최상위 수준 가져오기를 수행하고 각 mpf(메타 경로 찾기)에서 mpf.find_spec(“foo”, None, None)을 호출합니다. foo를 가져온 후에는 mpf.find_spec(“foo.bar”, foo.__path__, None)을 호출하여 메타 경로를 두 번째로 순회하여 foo.bar를 가져옵니다. foo.bar를 가져오면 최종 탐색에서 mpf.find_spec(“foo.bar.baz”, foo.bar.__path__, None)을 호출합니다.

일부 메타 경로 찾기는 최상위 수준 가져오기만 지원합니다. 이러한 임포터는 None 이외의 것이 두 번째 인수로 전달될 때 항상 None을 반환합니다.

Python의 기본 sys.meta_path에는 3개의 메타 경로 찾기가 있습니다. 하나는 내장 모듈을 가져오는 방법을 알고 있고, 다른 하나는 고정된 모듈을 가져오는 방법을 알고 있으며, 다른 하나는 가져오기 경로(즉, 경로 기반 찾기)에서 모듈을 가져오는 방법을 알고 있습니다. .

버전 3.4에서 변경: 메타 경로 찾기의 find_spec() 메서드는 이제 더 이상 사용되지 않는 find_module()을 대체했습니다. 변경 없이 계속 작동하는 동안 가져오기 기계는 파인더가 find_spec()을 구현하지 않는 경우에만 이를 시도합니다.

5.4. Loading

모듈 사양이 발견되면 가져오기 기계는 모듈을 로드할 때 이를 사용합니다(및 여기에 포함된 로더). 가져오기 부분을 로드하는 동안 발생하는 대략적인 결과는 다음과 같습니다.

module = None
if spec.loader is not None and hasattr(spec.loader, 'create_module'):
    # It is assumed 'exec_module' will also be defined on the loader.
    module = spec.loader.create_module(spec)
if module is None:
    module = ModuleType(spec.name)
# The import-related module attributes get set here:
_init_module_attrs(spec, module)

if spec.loader is None:
    # unsupported
    raise ImportError
if spec.origin is None and spec.submodule_search_locations is not None:
    # namespace package
    sys.modules[spec.name] = module
elif not hasattr(spec.loader, 'exec_module'):
    module = spec.loader.load_module(spec.name)
    # Set __loader__ and __package__ if missing.
else:
    sys.modules[spec.name] = module
    try:
        spec.loader.exec_module(module)
    except BaseException:
        try:
            del sys.modules[spec.name]
        except KeyError:
            pass
        raise
return sys.modules[spec.name]

다음 세부 사항에 유의하십시오.

  • sys.modules에 주어진 이름을 가진 기존 모듈 객체가 있으면 가져오기가 이미 반환했을 것입니다.
  • 모듈은 로더가 모듈 코드를 실행하기 전에 sys.modules에 존재합니다. 이것은 모듈 코드가 (직간접적으로) 자신을 가져올 수 있기 때문에 중요합니다. 미리 sys.modules에 추가하면 최악의 경우 무제한 재귀를 방지하고 최상의 경우 다중 로드를 방지합니다.
  • 로드에 실패하면 실패한 모듈과 실패한 모듈만 sys.modules에서 제거됩니다. sys.modules 캐시에 이미 있는 모든 모듈과 부작용으로 성공적으로 로드된 모든 모듈은 캐시에 남아 있어야 합니다. 이는 실패한 모듈도 sys.modules에 남아 있는 재로딩과 대조됩니다.
  • 모듈이 생성된 후 실행되기 전에 가져오기 기계는 이후 섹션에 요약된 대로 가져오기 관련 모듈 속성(위의 의사 코드 예제에서 “_init_module_attrs”)을 설정합니다.
  • 모듈 실행은 모듈의 네임스페이스가 채워지는 중요한 로딩 순간입니다. 실행은 전적으로 로더에 위임되어 무엇을 어떻게 채울지 결정합니다.
  • 로드 중에 생성되어 exec_module()에 전달된 모듈은 가져오기 2 종료 시 반환된 모듈이 아닐 수 있습니다.

버전 3.4에서 변경: 가져오기 시스템이 로더의 상용구 책임을 인수했습니다. 이들은 이전에 importlib.abc.Loader.load_module() 메서드에 의해 수행되었습니다.

5.4.1. Loaders

모듈 로더는 로드의 중요한 기능인 모듈 실행을 제공합니다. 가져오기 기계는 실행할 모듈 개체인 단일 인수를 사용하여 importlib.abc.Loader.exec_module() 메서드를 호출합니다. exec_module()에서 반환된 모든 값은 무시됩니다.

로더는 다음 요구 사항을 충족해야 합니다.

  • 모듈이 Python 모듈(내장 모듈 또는 동적으로 로드되는 확장과 반대)인 경우 로더는 모듈의 전역 네임스페이스(module.__dict__)에서 모듈의 코드를 실행해야 합니다.
  • 로더가 모듈을 실행할 수 없는 경우, exec_module() 중에 발생한 다른 예외가 전파되더라도 ImportError를 발생시켜야 합니다.

대부분의 경우 파인더와 로더는 동일한 객체일 수 있습니다. 이러한 경우 find_spec() 메서드는 로더가 self로 설정된 사양을 반환합니다.

모듈 로더는 create_module() 메서드를 구현하여 로드하는 동안 모듈 객체를 생성하도록 선택할 수 있습니다. 모듈 사양이라는 하나의 인수를 사용하고 로드하는 동안 사용할 새 모듈 개체를 반환합니다. create_module()은 모듈 객체에 어떤 속성도 설정할 필요가 없습니다. 메서드가 None을 반환하면 가져오기 기계가 새 모듈 자체를 생성합니다.

버전 3.4에 추가: 로더의 create_module() 메서드.

버전 3.4에서 변경: load_module() 메서드는 exec_module()로 대체되었고 가져오기 기계가 로딩의 모든 상용구 책임을 맡았습니다.

기존 로더와의 호환성을 위해 가져오기 기계는 로더가 존재하고 로더가 exec_module()도 구현하지 않는 경우 로더의 load_module() 메서드를 사용합니다. 그러나 load_module()은 더 이상 사용되지 않으며 로더는 대신 exec_module()을 구현해야 합니다.

load_module() 메서드는 모듈을 실행하는 것 외에도 위에서 설명한 모든 상용구 로드 기능을 구현해야 합니다. 몇 가지 추가 설명과 함께 모든 동일한 제약 조건이 적용됩니다.

  • sys.modules에 지정된 이름을 가진 기존 모듈 개체가 있는 경우 로더는 해당 기존 모듈을 사용해야 합니다. (그렇지 않으면 importlib.reload()가 제대로 작동하지 않습니다.) 명명된 모듈이 sys.modules에 없으면 로더는 새 모듈 객체를 생성하고 sys.modules에 추가해야 합니다.
  • 무제한 재귀 또는 다중 로드를 방지하려면 로더가 모듈 코드를 실행하기 전에 모듈이 sys.modules에 있어야 합니다.
  • 로드에 실패하면 로더는 sys.modules에 삽입한 모든 모듈을 제거해야 하지만 실패한 모듈만 제거해야 하며 로더 자체가 모듈을 명시적으로 로드한 경우에만 제거해야 합니다.

버전 3.5에서 변경: exec_module()이 정의되었지만 create_module()이 정의되지 않은 경우 DeprecationWarning이 발생합니다.

버전 3.6에서 변경: exec_module()이 정의되었지만 create_module()이 정의되지 않은 경우 ImportError가 발생합니다.

버전 3.10에서 변경: load_module()을 사용하면 ImportWarning이 발생합니다.

5.4.2. Submodules

어떤 메커니즘(예: importlib API, import 또는 import-from 문 또는 내장 __import__())을 사용하여 하위 모듈이 로드되면 하위 모듈 객체에 대한 바인딩이 상위 모듈의 네임스페이스에 배치됩니다. 예를 들어, spam 패키지에 foo 하위 모듈이 있는 경우 spam.foo를 가져온 후 spam은 하위 모듈에 바인딩된 foo 속성을 갖게 됩니다. 다음과 같은 디렉토리 구조가 있다고 가정해 보겠습니다.

spam/
    __init__.py
    foo.py

spam/__init__.py에는 다음 줄이 있습니다.

from .foo import Foo

그런 다음 다음을 실행하면 foo 및 Foo에 대한 이름 바인딩이 스팸 모듈에 저장됩니다.

>>> import spam
>>> spam.foo
<module 'spam.foo' from '/tmp/imports/spam/foo.py'>
>>> spam.Foo
<class 'spam.foo.Foo'>

Python의 친숙한 이름 바인딩 규칙을 고려할 때 이것은 놀라운 것처럼 보일 수 있지만 실제로는 가져오기 시스템의 기본 기능입니다. 변하지 않는 것은 sys.modules[‘spam’] 및 sys.modules[‘spam.foo’]가 있는 경우(위의 가져오기 후와 마찬가지로) 후자가 전자의 foo 속성으로 나타나야 한다는 것입니다.

5.4.3. Module spec

가져오기 기계는 가져오는 동안, 특히 로드하기 전에 각 모듈에 대한 다양한 정보를 사용합니다. 대부분의 정보는 모든 모듈에 공통입니다. 모듈 사양의 목적은 이 가져오기 관련 정보를 모듈별로 캡슐화하는 것입니다.

가져오기 중에 사양을 사용하면 가져오기 시스템 구성 요소 간에 상태를 전송할 수 있습니다. 모듈 스펙을 생성하는 파인더와 이를 실행하는 로더 사이. 가장 중요한 것은 가져오기 기계가 로드의 상용구 작업을 수행할 수 있는 반면 모듈 사양이 없으면 로더가 그 책임을 진다는 것입니다.

모듈의 사양은 모듈 객체의 __spec__ 속성으로 노출됩니다. 모듈 사양의 내용에 대한 자세한 내용은 ModuleSpec을 참조하십시오.

버전 3.4의 새로운 기능.

5.4.4. Import-related module attributes

가져오기 기계는 로더가 모듈을 실행하기 전에 모듈의 사양에 따라 로드하는 동안 각 모듈 객체에 이러한 속성을 채웁니다.

__name__
__name__ 속성은 모듈의 정규화된 이름으로 설정되어야 합니다. 이 이름은 가져오기 시스템에서 모듈을 고유하게 식별하는 데 사용됩니다.

__loader__
__loader__ 속성은 모듈을 로드할 때 가져오기 기계가 사용한 로더 객체로 설정되어야 합니다. 이는 대부분 내부 검사용이지만 추가 로더 관련 기능(예: 로더와 연결된 데이터 가져오기)에 사용할 수 있습니다.

__package__
모듈의 __package__ 속성을 설정해야 합니다. 값은 문자열이어야 하지만 __name__과 같은 값일 수 있습니다. 모듈이 패키지인 경우 __package__ 값을 __name__으로 설정해야 합니다. 모듈이 패키지가 아닌 경우 __package__는 최상위 모듈의 경우 빈 문자열로, 하위 모듈의 경우 상위 패키지 이름으로 설정해야 합니다. 자세한 내용은 PEP 366을 참조하십시오.

이 속성은 PEP 366에 정의된 대로 기본 모듈에 대한 명시적 상대 가져오기를 계산하기 위해 __name__ 대신 사용됩니다. __spec__.parent와 동일한 값을 가질 것으로 예상됩니다.

버전 3.6에서 변경: __package__의 값은 __spec__.parent와 같을 것으로 예상됩니다.

__spec__
__spec__ 속성은 모듈을 가져올 때 사용된 모듈 사양으로 설정되어야 합니다. __spec__ 설정은 인터프리터 시작 중에 초기화된 모듈에 동일하게 적절하게 적용됩니다. 한 가지 예외는 __main__입니다. 여기서 __spec__은 경우에 따라 None으로 설정됩니다.

__package__가 정의되지 않은 경우 __spec__.parent가 폴백으로 사용됩니다.

버전 3.4의 새로운 기능.

버전 3.6에서 변경: __spec__.parent는 __package__가 정의되지 않은 경우 폴백으로 사용됩니다.

__path__
모듈이 패키지(일반 또는 네임스페이스)인 경우 모듈 객체의 __path__ 속성을 설정해야 합니다. 값은 반복 가능해야 하지만 __path__에 더 이상 의미가 없는 경우 비어 있을 수 있습니다. __path__가 비어 있지 않으면 반복될 때 문자열을 생성해야 합니다. __path__의 의미 체계에 대한 자세한 내용은 아래에 나와 있습니다.

패키지가 아닌 모듈에는 __path__ 속성이 없어야 합니다.

__file__
__cached__
__file__은 선택 사항입니다(설정된 경우 값은 문자열이어야 함). 모듈이 로드된 파일의 경로 이름(파일에서 로드된 경우) 또는 공유 라이브러리에서 동적으로 로드된 확장 모듈의 공유 라이브러리 파일 경로 이름을 나타냅니다. 인터프리터에 정적으로 연결된 C 모듈과 같은 특정 유형의 모듈에서는 누락될 수 있으며 가져오기 시스템은 의미론적 의미가 없는 경우(예: 데이터베이스에서 로드된 모듈) 설정되지 않은 상태로 두도록 선택할 수 있습니다.

__file__이 설정되면 __cached__ 속성도 설정될 수 있습니다. 이는 코드의 컴파일된 버전(예: 바이트 컴파일된 파일)의 경로입니다. 이 속성을 설정하기 위해 파일이 존재할 필요는 없습니다. 경로는 단순히 컴파일된 파일이 존재하는 위치를 가리킬 수 있습니다(PEP 3147 참조).

__file__이 설정되지 않은 경우에도 __cached__가 설정될 수 있습니다. 그러나 그 시나리오는 매우 이례적입니다. 궁극적으로 로더는 파인더가 제공하는 모듈 사양을 사용하는 것입니다(여기에서 __file__ 및 __cached__가 파생됨). 따라서 로더가 캐시된 모듈에서 로드할 수 있지만 파일에서 로드하지 않는 경우 이러한 비정형 시나리오가 적절할 수 있습니다.

5.4.5. module.__path__

정의에 따르면 모듈에 __path__ 속성이 있으면 패키지입니다.

패키지의 __path__ 속성은 하위 패키지를 가져오는 동안 사용됩니다. 가져오기 기계 내에서 sys.path와 거의 동일한 기능을 합니다. 즉, 가져오는 동안 모듈을 검색할 위치 목록을 제공합니다. 그러나 __path__는 일반적으로 sys.path보다 훨씬 더 제한적입니다.

__path__는 문자열의 이터러블이어야 하지만 비어 있을 수 있습니다. sys.path에 사용된 것과 동일한 규칙이 패키지의 __path__에도 적용되며 sys.path_hooks(아래에 설명됨)는 패키지의 __path__를 통과할 때 참조됩니다.

패키지의 __init__.py 파일은 패키지의 __path__ 속성을 설정하거나 변경할 수 있으며 이는 일반적으로 네임스페이스 패키지가 PEP 420 이전에 구현된 방식이었습니다. PEP 420을 채택함에 따라 네임스페이스 패키지는 더 이상 오직 __path__의 조작코드만 포함하고 있는 __init__.py파일을 지원할 필요가 없어졌습니다; 가져오기 기계는 네임스페이스 패키지에 대해 자동으로 __path__를 올바르게 설정합니다.

5.4.6. Module reprs

기본적으로 모든 모듈에는 사용 가능한 repr이 있지만 위에서 설정한 속성과 모듈 사양에 따라 모듈 객체의 repr을 보다 명시적으로 제어할 수 있습니다.

모듈에 사양(__spec__)이 있는 경우 가져오기 기계는 여기에서 repr을 생성하려고 시도합니다. 실패하거나 사양이 없는 경우 가져오기 시스템은 모듈에서 사용 가능한 모든 정보를 사용하여 기본 repr을 만듭니다. 누락된 정보에 대한 기본값과 함께 module.__name__, module.__file__ 및 module.__loader__를 repr에 대한 입력으로 사용하려고 시도합니다.

사용된 정확한 규칙은 다음과 같습니다.

  • 모듈에 __spec__ 속성이 있으면 사양의 정보가 repr을 생성하는 데 사용됩니다. “name”, “loader”, “origin” 및 “has_location” 속성이 참조됩니다.
  • 모듈에 __file__ 속성이 있으면 모듈의 repr의 일부로 사용됩니다.
  • 모듈에 __file__은 없지만 None이 아닌 __loader__가 있는 경우 로더의 repr이 모듈 repr의 일부로 사용됩니다.
  • 그렇지 않으면 repr에서 모듈의 __name__을 사용합니다.

버전 3.4에서 변경: loader.module_repr() 사용은 더 이상 사용되지 않으며 모듈 사양은 이제 가져오기 기계에서 모듈 repr을 생성하는 데 사용됩니다.

Python 3.3과의 역호환을 위해 모듈 repr은 정의된 경우 위에서 설명한 접근 방식을 시도하기 전에 로더의 module_repr() 메서드를 호출하여 생성됩니다. 그러나 이 방법은 더 이상 사용되지 않습니다.

버전 3.10에서 변경: module_repr() 호출은 이제 모듈의 __spec__ 속성을 사용하려고 시도한 후 __file__로 돌아가기 전에 발생합니다. module_repr()의 사용은 Python 3.12에서 중단될 예정입니다.

5.4.7. Cached bytecode invalidation

Python은 .pyc 파일에서 캐시된 바이트코드를 로드하기 전에 캐시가 소스 .py 파일로 최신인지 확인합니다. 기본적으로 Python은 소스를 작성할 때 캐시 파일에 소스의 마지막 수정 타임스탬프와 크기를 저장하여 이를 수행합니다. 런타임에 가져오기 시스템은 소스의 메타데이터와 비교하여 캐시 파일에 저장된 메타데이터를 확인하여 캐시 파일의 유효성을 검사합니다.

Python은 또한 소스 파일의 메타데이터가 아닌 콘텐츠의 해시를 저장하는 “해시 기반” 캐시 파일을 지원합니다. 해시 기반 .pyc 파일에는 선택 및 선택 해제의 두 가지 변형이 있습니다. 확인된 해시 기반 .pyc 파일의 경우 Python은 소스 파일을 해시하고 결과 해시를 캐시 파일의 해시와 비교하여 캐시 파일의 유효성을 검사합니다. 확인된 해시 기반 캐시 파일이 유효하지 않은 것으로 확인되면 Python은 파일을 재생성하고 새롭게 확인된 해시 기반 캐시 파일을 작성합니다. 확인되지 않은 해시 기반 .pyc 파일의 경우 Python은 단순히 캐시 파일이 존재하는 경우 유효하다고 가정합니다. 해시 기반 .pyc 파일 유효성 검사 동작은 –check-hash-based-pycs 플래그로 재정의될 수 있습니다.

버전 3.7에서 변경: 해시 기반 .pyc 파일을 추가했습니다. 이전에 Python은 바이트코드 캐시의 타임스탬프 기반 무효화만 지원했습니다.

5.5. The Path Based Finder

앞에서 언급했듯이 Python에는 몇 가지 기본 메타 경로 찾기가 제공됩니다. 경로 기반 파인더(PathFinder)라고 하는 이들 중 하나는 경로 항목 목록이 포함된 가져오기 경로를 검색합니다. 각 경로 항목은 모듈을 검색할 위치의 이름을 지정합니다.

경로 기반 파인더 자체는 아무것도 가져오는 방법을 모릅니다. 대신 개별 경로 항목을 순회하여 각 항목을 해당 특정 종류의 경로를 처리하는 방법을 알고 있는 경로 항목 찾기와 연결합니다.

기본 경로 항목 찾기 세트는 파일 시스템에서 모듈을 찾기 위한 모든 의미 체계를 구현하고 Python 소스 코드(.py 파일), Python 바이트 코드(.pyc 파일) 및 공유 라이브러리(예: .so 파일)와 같은 특수 파일 유형을 처리합니다. ). 표준 라이브러리의 zipimport 모듈에서 지원하는 경우 기본 경로 항목 찾기는 zip 파일에서 이러한 모든 파일 유형(공유 라이브러리 제외) 로드도 처리합니다.

경로 항목은 파일 시스템 위치로 제한될 필요가 없습니다. URL, 데이터베이스 쿼리 또는 문자열로 지정할 수 있는 기타 위치를 참조할 수 있습니다.

경로 기반 파인더는 검색 가능한 경로 항목의 유형을 확장하고 사용자 정의할 수 있도록 추가 후크 및 프로토콜을 제공합니다. 예를 들어 경로 항목을 네트워크 URL로 지원하려는 경우 HTTP 의미 체계를 구현하는 후크를 작성하여 웹에서 모듈을 찾을 수 있습니다. 이 후크(콜러블)는 아래에 설명된 프로토콜을 지원하는 경로 항목 찾기를 반환하며, 이후 웹에서 모듈에 대한 로더를 가져오는 데 사용되었습니다.

주의 사항: 이 섹션과 이전 섹션 모두 파인더라는 용어를 사용하며 메타 경로 파인더와 경로 항목 파인더라는 용어를 사용하여 이들을 구분합니다. 이 두 가지 유형의 파인더는 매우 유사하고 유사한 프로토콜을 지원하며 가져오기 프로세스 중에 유사한 방식으로 작동하지만 미묘하게 다르다는 점을 명심하는 것이 중요합니다. 특히 메타 경로 파인더는 sys.meta_path 순회를 키 오프한 것처럼 가져오기 프로세스의 시작 부분에서 작동합니다.

대조적으로, 경로 항목 찾기는 어떤 의미에서 경로 기반 찾기의 구현 세부 사항이며 실제로 경로 기반 찾기가 sys.meta_path에서 제거되면 경로 항목 찾기 의미 체계가 호출되지 않습니다.

5.5.1. Path entry finders

경로 기반 파인더는 위치가 문자열 경로 항목으로 지정된 Python 모듈 및 패키지를 찾고 로드하는 역할을 합니다. 대부분의 경로 항목은 파일 시스템의 위치를 지정하지만 이에 제한될 필요는 없습니다.

메타 경로 찾기로서 경로 기반 찾기는 이전에 설명한 find_spec() 프로토콜을 구현하지만 가져오기 경로에서 모듈을 찾고 로드하는 방법을 사용자 지정하는 데 사용할 수 있는 추가 후크를 노출합니다.

세 가지 변수는 경로 기반 파인더, sys.path, sys.path_hooks 및 sys.path_importer_cache에서 사용됩니다. 패키지 객체의 __path__ 속성도 사용됩니다. 이는 가져오기 기계를 사용자 정의할 수 있는 추가 방법을 제공합니다.

sys.path에는 모듈 및 패키지의 검색 위치를 제공하는 문자열 목록이 포함되어 있습니다. PYTHONPATH 환경 변수와 다양한 기타 설치 및 구현 관련 기본값에서 초기화됩니다. sys.path의 항목은 URL 또는 데이터베이스 쿼리와 같은 모듈을 검색해야 하는 파일 시스템, zip 파일 및 잠재적으로 다른 “위치”(사이트 모듈 참조)의 디렉터리 이름을 지정할 수 있습니다. sys.path에는 문자열만 있어야 합니다. 다른 모든 데이터 유형은 무시됩니다.

경로 기반 파인더는 메타 경로 파인더이므로 임포트 기구는 이전에 설명한 대로 경로 기반 파인더의 find_spec() 메서드를 호출하여 임포트 경로 검색을 시작합니다. find_spec()에 대한 경로 인수가 주어지면 통과할 문자열 경로 목록이 됩니다. 일반적으로 해당 패키지 내 가져오기에 대한 패키지의 __path__ 속성입니다. 경로 인수가 없음이면 최상위 수준 가져오기를 나타내며 sys.path가 사용됩니다.

경로 기반 파인더는 검색 경로의 모든 항목을 반복하고 이들 각각에 대해 경로 항목에 대한 적절한 경로 항목 파인더(PathEntryFinder)를 찾습니다. 이는 비용이 많이 드는 작업일 수 있기 때문에(예: 이 검색에 대한 stat() 호출 오버헤드가 있을 수 있음) 경로 기반 찾기는 경로 항목 찾기에 대한 캐시 매핑 경로 항목을 유지합니다. 이 캐시는 sys.path_importer_cache에서 유지 관리됩니다(이름에도 불구하고 이 캐시는 임포터 개체로 제한되지 않고 실제로 파인더 개체를 저장합니다). 이러한 방식으로 특정 경로 항목 위치의 경로 항목 찾기에 대한 비용이 많이 드는 검색은 한 번만 수행하면 됩니다. 사용자 코드는 경로 기반 파인더가 경로 항목 검색을 다시 수행하도록 강제하는 sys.path_importer_cache에서 캐시 항목을 자유롭게 제거할 수 있습니다.

캐시에 경로 항목이 없으면 경로 기반 파인더는 sys.path_hooks의 모든 콜러블을 반복합니다. 이 목록의 각 경로 항목 후크는 검색할 경로 항목인 단일 인수로 호출됩니다. 이 콜러블은 경로 항목을 처리할 수 있는 경로 항목 찾기를 반환하거나 ImportError를 발생시킬 수 있습니다. ImportError는 후크가 해당 경로 항목에 대한 경로 항목 찾기를 찾을 수 없음을 알리기 위해 경로 기반 찾기에서 사용됩니다. 예외는 무시되고 가져오기 경로 반복이 계속됩니다. 후크는 문자열 또는 바이트열 객체를 예상해야 합니다. 바이트 객체의 인코딩은 후크에 달려 있으며(예: 파일 시스템 인코딩, UTF-8 또는 다른 것일 수 있음) 후크가 인수를 디코딩할 수 없으면 ImportError를 발생시켜야 합니다.

sys.path_hooks 반복이 반환되는 경로 항목 파인더 없이 종료되면 경로 기반 파인더의 find_spec() 메서드는 sys.path_importer_cache에 None을 저장하고(이 경로 항목에 대한 파인더가 없음을 나타냄) None을 반환합니다. 메타 경로 찾기에서 모듈을 찾을 수 없습니다.

경로 항목 찾기가 sys.path_hooks의 경로 항목 후크 콜러블 중 하나에 의해 반환되는 경우 다음 프로토콜을 사용하여 찾기에 모듈 사양을 요청한 다음 모듈을 로드할 때 사용합니다.

빈 문자열로 표시된 현재 작업 디렉토리는 sys.path의 다른 항목과 약간 다르게 처리됩니다. 첫째, 현재 작업 디렉터리가 존재하지 않는 것으로 확인되면 sys.path_importer_cache에 값이 저장되지 않습니다. 둘째, 현재 작업 디렉토리의 값은 각 모듈 조회에 대해 새로 조회됩니다. 셋째, sys.path_importer_cache에 사용되고 importlib.machinery.PathFinder.find_spec()에 의해 반환된 경로는 빈 문자열이 아니라 실제 현재 작업 디렉토리가 됩니다.

5.5.2. Path entry finder protocol

모듈 및 초기화된 패키지의 가져오기를 지원하고 네임스페이스 패키지에 일부를 기여하려면 경로 항목 찾기에서 find_spec() 메서드를 구현해야 합니다.

find_spec()은 가져오는 모듈의 정규화된 이름과 (선택 사항인) 대상 모듈의 두 가지 인수를 사용합니다. find_spec()은 모듈에 대해 완전히 채워진 사양을 반환합니다. 이 사양에는 항상 “로더”가 설정되어 있습니다(한 가지 예외 포함).

사양이 네임스페이스 부분을 나타내는 가져오기 기계에 표시하기 위해 경로 항목 찾기는 “submodule_search_locations”를 부분을 포함하는 목록으로 설정합니다.

버전 3.4에서 변경: find_spec()이 find_loader() 및 find_module()을 대체했습니다. 둘 다 현재 사용되지 않지만 find_spec()이 정의되지 않은 경우에 사용됩니다.

이전 경로 항목 찾기는 find_spec() 대신 이 두 가지 사용되지 않는 메서드 중 하나를 구현할 수 있습니다. 메서드는 이전 버전과의 호환성을 위해 여전히 존중됩니다. 그러나 경로 항목 찾기에서 find_spec()이 구현되면 기존 메서드는 무시됩니다.

find_loader()는 가져올 모듈의 정규화된 이름인 하나의 인수를 사용합니다. find_loader()는 첫 번째 항목이 로더이고 두 번째 항목이 네임스페이스 부분인 2-튜플을 반환합니다.

가져오기 프로토콜의 다른 구현과의 하위 호환성을 위해 많은 경로 항목 찾기는 메타 경로 찾기가 지원하는 것과 동일한 기존 find_module() 메서드도 지원합니다. 그러나 경로 항목 찾기 find_module() 메서드는 경로 인수와 함께 호출되지 않습니다(경로 후크에 대한 초기 호출에서 적절한 경로 정보를 기록해야 함).

경로 항목 찾기의 find_module() 메서드는 경로 항목 찾기가 네임스페이스 패키지에 부분을 제공하는 것을 허용하지 않으므로 더 이상 사용되지 않습니다. 경로 항목 찾기에 find_loader() 및 find_module()이 모두 존재하는 경우 가져오기 시스템은 항상 find_module()보다 먼저 find_loader()를 호출합니다.

버전 3.10에서 변경: 가져오기 시스템에서 find_module() 및 find_loader()를 호출하면 ImportWarning이 발생합니다.

5.6. Replacing the standard import system

전체 가져오기 시스템을 교체하는 가장 신뢰할 수 있는 메커니즘은 sys.meta_path의 기본 콘텐츠를 삭제하고 사용자 정의 메타 경로 후크로 완전히 교체하는 것입니다.

가져오기 시스템에 액세스하는 다른 API에 영향을 주지 않고 가져오기 문의 동작만 변경하는 것이 허용되는 경우 내장 __import__() 함수를 교체하는 것으로 충분할 수 있습니다. 이 기술은 모듈 수준에서 해당 모듈 내 import 문의 동작만 변경하기 위해 사용할 수도 있습니다.

메타 경로의 초기 후크에서 일부 모듈 가져오기를 선택적으로 방지하려면(표준 가져오기 시스템을 완전히 비활성화하는 대신) None을 반환하는 대신 find_spec()에서 직접 ModuleNotFoundError를 발생시키는 것으로 충분합니다. 후자는 메타 경로 검색이 계속되어야 함을 나타내며 예외가 발생하면 즉시 종료됩니다.

5.7. Package Relative Imports

상대 가져오기는 선행 점을 사용합니다. 단일 선행 점은 현재 패키지부터 시작하여 상대적 가져오기를 나타냅니다. 두 개 이상의 선행 점은 현재 패키지의 상위 항목에 대한 상대적 가져오기를 나타냅니다(첫 번째 이후 점당 한 수준). 예를 들어 다음 패키지 레이아웃이 주어진 경우:

package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py

subpackage1/moduleX.py 또는 subpackage1/__init__.py에서 다음은 유효한 상대 가져오기입니다.

from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo

절대 가져오기는 import <> 또는 from <> import <> 구문을 사용할 수 있지만 상대적 가져오기는 두 번째 형식만 사용할 수 있습니다. 그 이유는 다음과 같습니다.

import XXX.YYY.ZZZ

XXX.YYY.ZZZ를 사용 가능한 표현식으로 노출해야 하지만 .moduleY는 유효한 표현식이 아닙니다.

5.8. Special considerations for __main__

__main__ 모듈은 파이썬의 가져오기 시스템과 관련된 특별한 경우입니다. 다른 곳에서 언급했듯이 __main__ 모듈은 sys 및 builtins와 마찬가지로 인터프리터 시작 시 직접 초기화됩니다. 그러나 이 두 가지와 달리 내장 모듈로 엄격하게 제한되지는 않습니다. 이는 __main__ 이 초기화되는 방식이 인터프리터가 호출되는 플래그 및 기타 옵션에 따라 달라지기 때문입니다.

5.8.1. __main__.__spec__

__main__이 초기화되는 방식에 따라 __main__.__spec__이 적절하게 설정되거나 None으로 설정됩니다.

-m 옵션으로 Python을 시작하면 __spec__이 해당 모듈 또는 패키지의 모듈 사양으로 설정됩니다. __spec__은 __main__ 모듈이 디렉토리, zip 파일 또는 기타 sys.path 항목 실행의 일부로 로드될 때도 채워집니다.

나머지 경우에는 __main__을 채우는 데 사용되는 코드가 가져오기 가능한 모듈과 직접 일치하지 않기 때문에 __main__.__spec__이 None으로 설정됩니다.

  • 대화식 프롬프트
  • -c 옵션
  • stdin에서 실행
  • 소스 또는 바이트코드 파일에서 직접 실행

__main__.__spec__은 파일을 기술적으로 모듈로 직접 가져올 수 있는 경우에도 마지막 경우에 항상 None입니다. __main__에서 유효한 모듈 메타데이터가 필요한 경우 -m 스위치를 사용하십시오.

또한 __main__이 임포트 가능한 모듈에 해당하고 __main__.__spec__이 그에 따라 설정된 경우에도 여전히 별개의 모듈로 간주됩니다. 이는 if __name__ == “__main__”: 검사가 보호하는 블록이 모듈이 __main__ 네임스페이스를 채우는 데 사용될 때만 실행되고 일반 가져오기 중에는 실행되지 않기 때문입니다.

5.9. References

가져오기 기계는 Python 초기부터 상당히 발전했습니다. 패키지의 원래 사양은 해당 문서 작성 이후 일부 세부 사항이 변경되었지만 여전히 읽을 수 있습니다.

sys.meta_path의 원래 사양은 PEP 302였으며 후속 확장은 PEP 420이었습니다.

PEP 420은 Python 3.3용 네임스페이스 패키지를 도입했습니다. PEP 420은 또한 find_module()의 대안으로 find_loader() 프로토콜을 도입했습니다.

PEP 366은 기본 모듈의 명시적 상대 가져오기를 위한 __package__ 속성 추가를 설명합니다.

PEP 328은 절대적이고 명시적인 상대 가져오기를 도입했으며 시맨틱에 대해 처음 제안된 __name__은 PEP 366이 결국 __package__에 대해 지정할 것입니다.

PEP 338은 실행 모듈을 스크립트로 정의합니다.

PEP 451은 사양 개체에서 모듈별 가져오기 상태의 캡슐화를 추가합니다. 또한 로더의 상용구 책임 대부분을 수입 기계로 다시 오프로드합니다. 이러한 변경 사항을 통해 가져오기 시스템에서 여러 API의 사용이 중단되고 파인더 및 로더에 새로운 메서드를 추가할 수 있습니다.

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