App Icons

이번 시간에는 Material라이브러리에 기본적으로 정의가 되어있는 아이콘들을 사용해서 앱을 꾸며보는 시간을 갖도록 하겠습니다. 이전 시간에 사용했던 코드의 플로팅 액션버튼에 “+” 모양의 아이콘을 넣어볼게요. FloatingActionButtonchild값을 아래와 같이 Icon()으로 변경해주어 아이콘을 넣겠다고 명시합니다. 그리고 그 안에 인자로 Icons.add를 입력하여 기존의 Icons에 정의되어 있는 아이콘들 중 “+”모양의 아이콘을 사용하겠다고 명시합니다.

        floatingActionButton: FloatingActionButton(
          onPressed: () => {},
          child: const Icon(Icons.add),
        ),

그리고 하단의 네비게이션 바에도 아래와 같이 코드를 변경해주세요. bottomNavigationBar의 값으로 BottomNavigationBar()클래스를 선언하고, items배열에 Icons.home, Icons.business, Icons.school 이렇게 세개의 아이콘을 넣고 아이콘 밑에 라벨도 각각 Home, Business, School이라고 써줄거에요.

        bottomNavigationBar: BottomNavigationBar(
          items: const <BottomNavigationBarItem>[
            BottomNavigationBarItem(
              icon: Icon(Icons.home),
              label: 'Home',
            ),
            BottomNavigationBarItem(
              icon: Icon(Icons.business),
              label: 'Business',
            ),
            BottomNavigationBarItem(
              icon: Icon(Icons.school),
              label: 'School',
            ),
          ],
        ),

코드를 실행하면 왼쪽의 그림과 같이 플로팅 버튼에는 “+”아이콘이, 그리고 하단 네비게이션 바에는 각각 명시한대로 3개의 아이콘과 라벨이 각각 들어가있는 것을 확인하실 수 있습니다.

그 밖에 다른 아이콘들을 더 보고 싶으시면 Icons class페이지에서 확인하실 수 있습니다.

준비운동은 이만한면 된것 같아요. 여기까지 열심히 따라와 주셔서 감사합니다.

Android Studio와 화면 구성하는 방법에 대해 조금은 친근해지셨기를 바라면서, 다음 시간에는 실제 개발을 할때 구성하는 코드 구조에 대해서 공부하고 실제 프로젝트를 시뮬레이션하면서 더욱 풍부한 UI표현들을 배워보도록 하겠습니다. 감사합니다.

Image Assets

이번시간에는 지난 시간에 만든 코드를 활용해서 이미지를 넣어보도록 하겠습니다.

우선 이미지를 앱에 넣으려면 이미지가 있어야겠죠? 원하는 이미지를 하나 다운 받습니다. 그리고 어제 만든 Hello World앱을 열어서 Android Studio의 왼쪽 폴더목록에서 images라는 폴더를 하나 생성한 후 다운 받은 이미지를 드래그하여 그 폴더 안에 저장합니다.

저는 귀여운 고양이 이미지를 다운받아서 images폴더 안에 저장했습니다. 이 이미지를 앱에서 사용하기 위해서는 asset으로 등록을 해야하는데 그 방법은 다음과 같습니다.

루트폴더의 pubspec.yaml파일을 클릭하여 엽니다. 이 파일은 앱에 필요한 각종 설정값이나 환경변수들을 저장해 두는 곳인데요. 여기서 assets:이 설정되어있는 부분을 찾습니다.

현재는 아무 asset이 없으므로 주석처리가 되어있는데 주석을 없애고 이미지가 저장된 경로를 명시하여 asset을 설정합니다.

Yaml파일에 값을 추가할때는 들여쓰기에 주의해주세요.

다시 main.dart파일을 열어서 지난 시간body부분에 넣었던 Text()함수 대신에 아래와 같이 Image()함수로 대체합니다.

        body: const Center(
          child: Image(
            image: AssetImage('images/cat.png'),
          ),
        ),

image속성의 값으로 AssetImage()대신 인터넷상에 있는 주소를 그대로 갖다 쓰고 싶으면 NetworkImage()를 써도 됩니다. 하지만 안정적인 서비스를 위해 AssetImage()의 사용을 추천드립니다.

완성된 전체 코드는 아래와 같습니다.

import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Image Assets'),
        ),
        body: const Center(
          child: Image(
            image: AssetImage('images/cat.png'),
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () => {},
          child: const Text('float'),
        ),
        bottomNavigationBar: const Text('bottomNavigationBar'),
      ),
    ),
  );
}

실행하면 다음과 같이 예쁜 이미지가 body안에 들어갑니다.

다음 시간에는 앱에서 제공하는 다양한 아이콘들을 활용해보는 시간을 갖도록 하겠습니다. 감사합니다.

Hello World with Scaffold()

일단 Hello World를 Scaffold()를 추가로 넣어서 구현을 한다면 다음과 같습니다.

import 'package:flutter/material.dart';

void main() {
  runApp(
    const MaterialApp(
      home: Scaffold(
        body: Center(
          child: Text(
            'Hello World!',
          ),
        ),
      ),
    ),
  );
}

home의 값으로 Center()대신에 Scaffold()가 들어가고 Scaffold()body의 값에 Center()를 넣어줍니다.

실행을 해보면 다음과 같이 못생겼던 글씨가 조금 예뻐졌네요. 그래도 이건 안넣어도 잘 돌아가는데 굳이 넣어야할 필요가 있을까 싶으실거에요. Scaffold()는 단지 글씨체만 예쁘게 하는건 아니구요. 앱개발에 기본적으로 필요한 컴포넌트들을 미리 구조적으로 정의해놓고 해당 키에 값만 넣으면 바로 앱이 완성되는 일종의 프레임워크 같은 기능을 합니다.

이해를 돕기 위해서 실제로 Scaffold()구조를 이용해서 간단하게 코드를 만들어 보았습니다. 아래 코드를 보시면 Scaffold()의 첫번째 속성으로 appBar가 있습니다. 모든 앱들은 상단에 타이틀이 들어가는데 그걸 손쉽게 구현할수 있도록 만들어둔 항목이구요. body는 내용이 들어가는 부분, 그리고 floatingActionButton은 둥둥 떠다니는 버튼을 구현할수 있는 항목입니다. 그리고 bottomNavigationBar가 있는데요. 이건 하단에 메뉴나 정보를 보여주고 싶을때 사용할수 있습니다.

import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('appBar'),
        ),
        body: const Center(
          child: Text('body'),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () => {},
          child: const Text('float'),
        ),
        bottomNavigationBar: const Text('bottomNavigationBar'),
      ),
    ),
  );
}

이 밖에도 Scaffold() 매뉴얼을 보시면 더 많은 속성들이 있는데 나머지 속성들은 차차 다루도록 하겠습니다.

Scaffold()를 이용하면 앱을 만들기 시작할때 맨땅에 헤딩하는 것보다 개발 속도가 빠르고 모든 디바이스에서 유연하며 예쁘게 앱을 구현할수 있게 도와줍니다.

이번 시간에는 여기까지 하고 다음시간에 body에 이미지를 넣는 방법에 대해서 공부해보도록 하겠습니다. 감사합니다.

References

Hello World with MaterialApp()

지난 시간에 기본코드를 이용하여 Hello World를 만들어보았는데요. 이번시간에는 MaterialApp()를 사용하여 Hello World를 구현해보도록 하겠습니다. 코드는 아래와 같습니다.

import 'package:flutter/material.dart';

void main() {
  runApp(
    const MaterialApp(
      home: Center(
        child: Text(
          'Hello World!',
        ),
      ),
    ),
  );
}

위의 코드를 보시면 MaterialApp()은 내용을 담는 부분을 home이라는 키값에 넣어줍니다. 그리고 지난번 강의때 설명드린대로 Text()함수의 두번째 인자 textDirection: TextDirection.ltr를 설정해주지 않았는데도 결과 화면을 보면 문자열이 왼쪽에서 오른쪽으로 잘 출력이 되었습니다. 그 이유는 MaterialApp()에 문자열의 방향에 대한 기본값이 이미 설정되어있기 때문에 따로 지정을 해주지 않아도 에러없이 실행이 되는 것입니다.

실행을 하면 다음과 같이 매우 못생긴 글씨체로 Hello World가 보입니다. 문서에 따르면 기본 폰트값을 세팅하지 않은것을 일깨워주기 위해 일부러 이렇게 했다는데 그냥 적당히 예쁜 폰트를 기본값으로 정해줬으면 좋았지 않나 개인적으로는 아쉬움이 좀 남네요.

다음시간에는 레이아웃을 좀더 편리하게 사용할수 있는 Scaffold()에 대해서 공부해보도록 하겠습니다. 감사합니다.

Hello World with Flutter

Android Studio에서 새로운 Flutter Project를 생성합니다. SDK위치가 정확한지 확인하고, Next를 클릭합니다. 

프로젝트 이름을 입력하고, Organization에 도메인 주소를 범위가 넣은 순으로 적어준 뒤 Create버튼을 클릭합니다.

프로젝트를 생성하면 많은 코드가 자동으로 생성이 되는데 이는 Flutter가 우리를 위해서 만들어준 데모코드입니다. 사실 Flutter는 언어는 아니고 Dart라는 언어를 이용해서 만든 프레임워크입니다. 그래서 Flutter로 프로젝트를 생성하면 Dart로 쓰인 코드가 주르륵 자동으로 만들어지는 것입니다. 데모 코드를 만들어 주고 각종 라이브러리를 제공하고 어떻게 코딩을 할지 가이드를 해주는 것이 바로 Flutter가 하는 일입니다.

Flutter가 만들어준 코드는 다음에 보기로 하고 이번시간에는 간단하게 Hello World를 보여주는 거니까 main.dart파일을 열어 기존에 자동으로 생성된 코드를 다 지우고 아래 코드를 입력합니다.

import 'package:flutter/material.dart';

void main() {
  runApp(
    const Center(
      child: Text(
        'Hello World!',
        textDirection: TextDirection.ltr,
      ),
    ),
  );
}

코드를 간략하게 설명하자면, 최상단의 material.dart를 포함한 이유는 Flutter의 레이아웃을 설계하는데 material에서 제공하는 많은 UI 컴포넌트들을 갖다 써야하기 때문입니다. 그 밑에 main()함수는 아무것도 반환하지 않는 void함수로 프로젝트가 실행되면 가정 먼저 실행되는 특별한 함수입니다. main()함수에 들어가면 바로 나오는 코드가 runApp()함수인데 인자안의 함수를 실행하는 일을 합니다.

runApp()함수의 인자로 Center()함수가 들어갔는데 이는 화면에 보이는 것들을 가운데로 정렬하는 레이어입니다. 그 앞에 붙은 const는 상수라는 말뜻 그대로 이하 내용들을 한번 만들면 변경하지 않고 프로그램이 종료될때까지 고정적으로 가져가겠다는 의미입니다.

Center()안에 들어갈 컴포넌트는 child라는 키에 값으로 넣는데요. Text()함수가 가운데 정렬을 제공하는 레이어 안에 들어가 있네요. Text()함수는 문자열을 화면에 보여주는 기능을 합니다. 첫번째 인자로 문자열, ‘Hello World!’를 입력하고 두번째 인자 textDirection의 값으로 들어간 TextDirection.ltr은 Left to Right의 줄임말로 글씨를 왼쪽에서 오른쪽으로 가는 순서대로 출력하라는 의미입니다. 히브리어는 영어와 다르게 문자를 읽는 순서가 다르기 때문에 이걸 명시 하도록 해 놓은 것인데요. 아마도 이걸 개발한 개발자가 유태인이 아닌가 싶습니다. 앞으로 배우게 될 MaterialApp()함수를 사용해서 레이아웃을 시작하면 기본 값이 세팅 되기 때문에 이걸 매번 써 주지 않아도 됩니다. 하지만 지금은 아주 기초적인 문법으로 코딩을 하고 있기 때문에 textDirection의 값을 명시 해야만 에러없이 앱이 실행 됩니다.

앱을 실행하기 위해서 우선 지난 시간에 배웠던 대로 애뮬레이터를 실행합니다. Android Studio 상단메뉴에서 실행된 애뮬레이터를 선택하고 main.dart를 선택한뒤 우측의 초록색 버튼을 눌러서 앱을 실행합니다.

실행결과는 왼쪽의 이미지와 같습니다.

모두들 여기까지 문제없이 오셨기를 기대하면서 다음시간에는 MaterialApp()를 이용하여 Hello World를 구현해보는 시간을 갖도록 하겠습니다. 감사합니다.

References:

Flutter Dev Environment on Mac

설치

Flutter

설치환경

  • 최소 700MB의 용량이 필요한데 10GB는 있어야 원활한 개발이 가능
  • iOS에서는 Mojave이상의 운영체제에서 설치가능

설치방법

참고사이트: https://docs.flutter.dev/get-started/install

1. flutter_macos_3.16.5-stable.zip을 다운받으세요 (CPU가 Intel인경우).

2. 압축을 풀면 flutter폴더가 생성되는데 이것을 home 폴더에 Developer라는 임의의 폴더를 하나 생성하고 그 안으로 이동시킵니다.

3. 이제 PATH 환경변수에 flutter 실행파일 경로를 추가해서 시스템에 flutter명령어를 실행할 파일의 위치를 알려줍니다.

.zshrc 파일을 열어 아래 명령어를 추가합니다.

export PATH="$PATH:$HOME/Developer/flutter/bin"

터미널을 재실행하여 PATH설정이 잘 되었는지 확인합니다.

$ which flutter
/Users/slim/Developer/flutter/bin/flutter
$ flutter --version
Flutter 3.13.4 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 367f9ea16b (3 months ago) • 2023-09-12 23:27:53 -0500
Engine • revision 9064459a8b
Tools • Dart 3.1.2 • DevTools 2.25.0

.zshrc에 위 명령어를 추가해도 터미널 재실행시 flutter가 인식되지 않으면 iOS버젼이 낮은거에요. .bash_profile에 넣으면 될거에요

flutter를 실행하기 위해 빠진것이 없는지 확인하기 위해 flutter docker를 실행합니다.

$ flutter doctor

┌─────────────────────────────────────────────────────────┐
│ A new version of Flutter is available!                  │
│                                                         │
│ To update to the latest version, run "flutter upgrade". │
└─────────────────────────────────────────────────────────┘
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.13.4, on macOS 12.7.1 21G920 darwin-x64, locale en-US)
[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
[✓] Xcode - develop for iOS and macOS (Xcode 14.2)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2022.3)
[✓] Connected device (3 available)
[✓] Network resources

• No issues found!

flutter가 사용하는 언어 dart는 flutter를 설치하면 자동으로 함께 설치가 되기 때문에 별도로 설치하지 않아도 됩니다.

만약 flutter docker가 아래와 같이 뭔가 추가로 설치하라고 지시하면 지시대로 해당 모듈을 설치하여 flutter를 실행하는데 필요한 모든 모듈들을 모두 설치해주세요.

[-] Android toolchain - develop for Android devices
    • Android SDK at /Users/dash/Library/Android/sdk
    ✗ Android SDK is missing command line tools; download from https://goo.gl/XxQghQ
    • Try re-installing or updating your Android SDK,
      visit https://docs.flutter.dev/setup/#android-setup for detailed instructions.

Android Studio

참고사이트: https://developer.android.com/studio

위의 사이트에서 Android Studio를 다운로드하고 설치합니다.

Android Studio를 열면 새프로젝트를 시작할수 있는 Welcome 화면이 뜹니다. 새로운 프로젝트를 시작하기 전에 Android Studio가 flutter를 잘 인식하고 있는지 확인해볼게요.

왼쪽 사이드바에서 Plugins를 클릭하면 오른쪽 패널에 함께 설치된 각종 라이브러리 목록이 뜹니다. 검색창에 flutter를 쳐서 Flutter Plugin을 설치해주세요. 그리고 Android Studio를 재실행하면 아래와 같이 체크박스에 on이 들어옵니다.

새로운 flutter 프로젝트를 시작해볼게요. New Flutter Project를 클릭하면 아래와 같이 뜨는데요. 여기서 Flutter SDK path가 정확한지 확인합니다.

Next버튼을 누르면 프로젝트의 이름 및 파일들의 저장위치를 지정할수 있는 화면으로 이동합니다.

프로젝트 이름을 적절히 변경하고, 각종 파일들의 위치를 지정한 뒤 create버튼을 클릭하면 아래와 같이 새 프로젝트가 생성됩니다.

Android Emulator

상단 메뉴에서 Device Manager 아이콘을 클릭합니다. Device Manager 패널의 상단에 Create Device버튼을 클릭하여 시뮬레이션을 하고 싶은 Device를 선택한뒤 Next버튼을 클릭합니다.

System Image를 선택하는 화면에서 Pie를 선택합니다. Pie 옆에 다운로드 버튼을 눌러 다운로드한 뒤 선택할수 있습니다.

옵션을 다 선택했으면 최종적으로 애뮬레이터 이름을 정한뒤 Finish버튼을 클릭합니다.

Device Manager패널에 새로운 Android 애뮬레이터가 추가 되었습니다. 프로젝트를 실행하기에 앞서 버튼을 눌러서 애뮬레이터를 실행해줍니다.

Android Studio의 상단메뉴에서 애뮬레이터를 선택하고 main.dart파일을 선택한뒤 실행 버튼을 누르면 맨 아래 Console창이 열리면서 컴파일 진행상태를 보여줍니다. 새 프로젝트의 첫 실행은 시간이 걸릴수 있습니다.

Device Manager의 애뮬레이터에 Sample프로젝트가 실행되었습니다.

iPhone Simulator

Install Xcode

참고자료: https://docs.flutter.dev/get-started/install/macos#ios-setup

여러분의 맥북에서 App Store 를 열고 Xcode를 검색해서 설치합니다. 설치가 끝나면 LaunchPad에 Xcode 아이콘이 보이고 그걸 열면 Xcode의 Welcome화면을 볼수 있습니다.

터미널에서도 xcode가 새로이 설치한 Xcode를 사용하도록 설정해줍니다.

sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -runFirstLaunch

# agreement
sudo xcodebuild -license

iOS 시뮬레이터 설정

iOS 시뮬레이터 다운로드

xcodebuild -downloadPlatform iOS

simulator.app을 search하거나 open -a Simulator 명령어를 통해서 시뮬레이터를 실행하면 상단에 Simulator메뉴가 나타나는데 거기에서 File > Open Simulator를 클릭해서 원하는 시뮬레이터를 실행할수 있습니다.

시뮬레이터를 실행한 상태에서 Android Studio를 확인하면 시뮬레이터가 메뉴에 들어와 있는 것을 확인할수 있습니다.

왼쪽에 보시는 것과 같이 iOS와 Android 시뮬레이터가 설치되었습니다. 이제 Flutter개발을 위한 준비가 완료 되었습니다. 다음 강좌부터는 Android Studio를 사용해서 실제 Flutter앱을 만들어 보도록 하겠습니다. 감사합니다.

string — Common string operations

Source code: Lib/string.py

See also:  Text Sequence Type — str
String Methods

String constants

이 모듈에 정의된 상수는 다음과 같습니다.

string.ascii_letters

아래에 설명된 ascii_lowercase 및 ascii_uppercase 상수의 연결입니다. 이 값은 로캘에 종속되지 않습니다.

string.ascii_lowercase

소문자 ‘abcdefghijklmnopqrstuvwxyz’. 이 값은 로캘에 종속되지 않으며 변경되지 않습니다.

string.ascii_uppercase

대문자 ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’. 이 값은 로캘에 종속되지 않으며 변경되지 않습니다.

string.digits

문자열 ‘0123456789’.

string.hexdigits

문자열 ‘0123456789abcdefABCDEF’.

string.octdigits

문자열 ‘01234567’.

string.punctuation

C 로케일에서 구두점 문자로 간주되는 ASCII 문자 문자열: !”#$%&'()*+,-./:;<=>?@[]^_`{|}~.

string.printable

인쇄 가능한 것으로 간주되는 ASCII 문자의 문자열입니다. 이것은 digits, ascii_letters, punctuationwhitespace의 조합입니다.

string.whitespace

공백으로 간주되는 모든 ASCII 문자를 포함하는 문자열입니다. 여기에는 문자 공백, 탭, 라인피드, 리턴, 폼피드 및 수직 탭이 포함됩니다.

Custom String Formatting

내장 문자열 클래스는 PEP 3101에 설명된 format() 메서드를 통해 복잡한 변수 대체 및 값 형식화를 수행할 수 있는 기능을 제공합니다. 문자열 모듈의 Formatter 클래스를 사용하면 동일한 구현을 사용하여 고유한 문자열 형식화 동작을 만들고 사용자 정의할 수 있습니다. 내장 format() 메서드로.

class string.Formatter

Formatter 클래스에는 다음과 같은 공용 메서드가 있습니다.

format(format_string/*args**kwargs)
기본 API 메서드입니다. 형식 문자열과 임의의 위치 및 키워드 인수 집합을 사용합니다. vformat()을 호출하는 래퍼일 뿐입니다.

버전 3.7에서 변경: 형식 문자열 인수는 이제 위치 전용입니다.

vformat(format_stringargskwargs)
이 기능은 실제 서식 작업을 수행합니다. *args 및 **kwargs 구문을 사용하여 사전을 개별 인수로 압축 해제하고 다시 압축하는 대신 미리 정의된 인수 사전을 전달하려는 경우 별도의 함수로 노출됩니다. vformat()은 형식 문자열을 문자 데이터와 대체 필드로 나누는 작업을 수행합니다. 아래에 설명된 다양한 메서드를 호출합니다.

또한 Formatter는 하위 클래스로 대체할 여러 메서드를 정의합니다.

parse(format_string)
format_string을 반복하고 반복 가능한 튜플(literal_text, field_name, format_spec, conversion)을 반환합니다. 이는 문자열을 리터럴 텍스트 또는 대체 필드로 나누기 위해 vformat()에서 사용됩니다.

튜플의 값은 개념적으로 단일 대체 필드가 뒤따르는 리터럴 텍스트의 범위를 나타냅니다. 리터럴 텍스트가 없는 경우(2개의 대체 필드가 연속적으로 발생하는 경우 발생할 수 있음) literal_text는 길이가 0인 문자열이 됩니다. 대체 필드가 없으면 field_name, format_spec 및 conversion 값은 None이 됩니다.

get_field(field_nameargskwargs)
parse()(위 참조)에 의해 반환된 field_name이 주어지면 서식을 지정할 개체로 변환합니다. 튜플(obj, used_key)을 반환합니다. 기본 버전은 “0[이름]” 또는 “label.title”과 같이 PEP 3101에 정의된 형식의 문자열을 사용합니다. args 및 kwargs는 vformat()에 전달됩니다. 반환 값 used_key는 get_value()에 대한 key 매개 변수와 동일한 의미를 갖습니다.

get_value(keyargskwargs)
주어진 필드 값을 검색합니다. 키 인수는 정수 또는 문자열입니다. 정수인 경우 args에서 위치 인수의 인덱스를 나타냅니다. 문자열이면 kwargs에서 명명된 인수를 나타냅니다.

args 매개변수는 vformat()에 대한 위치 인수 목록으로 설정되고 kwargs 매개변수는 키워드 인수 사전으로 설정됩니다.

복합 필드 이름의 경우 이러한 함수는 필드 이름의 첫 번째 구성 요소에 대해서만 호출됩니다. 후속 구성 요소는 일반 특성 및 인덱싱 작업을 통해 처리됩니다.

예를 들어 필드 표현식 ‘0.name’은 get_value()가 키 인수 0으로 호출되도록 합니다. name 속성은 내장 getattr() 함수를 호출하여 get_value()가 반환된 후에 조회됩니다.

인덱스나 키워드가 존재하지 않는 항목을 참조하는 경우 IndexError 또는 KeyError 가 발생해야 합니다.

check_unused_args(used_argsargskwargs)
원하는 경우 사용하지 않는 인수에 대한 검사를 구현하십시오. 이 함수에 대한 인수는 형식 문자열(위치 인수의 경우 정수, 명명된 인수의 경우 문자열)에서 실제로 참조된 모든 인수 키의 집합과 vformat에 전달된 args 및 kwargs에 대한 참조입니다. 미사용 인수 집합은 이러한 매개변수에서 계산할 수 있습니다. check_unused_args()는 확인에 실패하면 예외를 발생시키는 것으로 가정합니다.

format_field(valueformat_spec)
format_field()는 단순히 전역 format() 내장을 호출합니다. 메서드는 하위 클래스에서 재정의할 수 있도록 제공됩니다.

convert_field(valueconversion)
변환 유형( parse() 메서드에서 반환된 튜플에서와 같이)이 지정된 값(get_field()에서 반환됨)을 변환합니다. 기본 버전은 ‘s'(str), ‘r'(repr) 및 ‘a'(ascii) 변환 유형을 이해합니다.

Format String Syntax

str.format() 메서드와 Formatter 클래스는 형식 문자열에 대해 동일한 구문을 공유합니다(Formatter의 경우 하위 클래스는 자체 형식 문자열 구문을 정의할 수 있음). 구문은 형식이 지정된 문자열 리터럴과 관련이 있지만 덜 정교하며 특히 임의의 식을 지원하지 않습니다.

형식 문자열에는 중괄호 {}로 둘러싸인 “교체 필드”가 포함됩니다. 중괄호 안에 포함되지 않은 모든 항목은 그대로 출력에 복사되는 리터럴 텍스트로 간주됩니다. 리터럴 텍스트에 중괄호 문자를 포함해야 하는 경우 {{ 및 }}를 두 번 사용하여 이스케이프할 수 있습니다.

대체 필드의 문법은 다음과 같습니다.

replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*
arg_name          ::=  [identifier | digit+]
attribute_name    ::=  identifier
element_index     ::=  digit+ | index_string
index_string      ::=  <any source character except "]"> +
conversion        ::=  "r" | "s" | "a"
format_spec       ::=  <described in the next section>

덜 형식적인 용어로 대체 필드는 값이 형식화되어 대체 필드 대신 출력에 삽입될 개체를 지정하는 field_name으로 시작할 수 있습니다. field_name 뒤에는 선택적으로 느낌표 ‘!’가 앞에 오는 변환 필드와 콜론 ‘:’이 앞에 오는 format_spec이 옵니다. 대체 값에 대해 기본이 아닌 형식을 지정합니다.

형식 사양 미니 언어 섹션도 참조하십시오.

field_name 자체는 숫자 또는 키워드인 arg_name으로 시작합니다. 숫자이면 위치 인수를 참조하고 키워드이면 명명된 키워드 인수를 참조합니다. 형식 문자열의 숫자 arg_names가 순서대로 0, 1, 2, …인 경우 모두 생략할 수 있으며(일부만 아님) 숫자 0, 1, 2, …이 순서대로 자동으로 삽입됩니다. arg_name은 따옴표로 구분되지 않기 때문에 형식 문자열 내에서 임의의 사전 키(예: 문자열 ’10’ 또는 ‘:-]’)를 지정할 수 없습니다. arg_name 뒤에는 여러 인덱스 또는 속성 표현식이 올 수 있습니다. ‘.name’ 형식의 표현식은 getattr()을 사용하여 명명된 속성을 선택하는 반면 ‘[index]’ 형식의 표현식은 __getitem__()을 사용하여 인덱스 조회를 수행합니다.

버전 3.1에서 변경: str.format()에 대해 위치 인수 지정자를 생략할 수 있으므로 ‘{} {}’.format(a, b)는 ‘{0} {1}’.format(a, b)와 동일합니다. ).

버전 3.4에서 변경: 포매터에 대해 위치 인수 지정자를 생략할 수 있습니다.

몇 가지 간단한 형식 문자열 예:

"First, thou shalt count to {0}"  # References first positional argument
"Bring me a {}"                   # Implicitly references the first positional argument
"From {} to {}"                   # Same as "From {0} to {1}"
"My quest is {name}"              # References keyword argument 'name'
"Weight in tons {0.weight}"       # 'weight' attribute of first positional arg
"Units destroyed: {players[0]}"   # First element of keyword argument 'players'.

변환 필드는 형식을 지정하기 전에 유형 강제 변환을 일으킵니다. 일반적으로 값을 형식화하는 작업은 값 자체의 __format__() 메서드에 의해 수행됩니다. 그러나 어떤 경우에는 유형을 문자열로 강제 지정하여 자체 형식 지정 정의를 재정의하는 것이 바람직합니다. __format__()을 호출하기 전에 값을 문자열로 변환하면 일반적인 형식 논리가 무시됩니다.

현재 세 가지 변환 플래그가 지원됩니다. 값에 대해 str()을 호출하는 ‘!s’, repr()을 호출하는 ‘!r’ 및 ascii()를 호출하는 ‘!a’입니다.

몇 가지 예:

"Harold's a clever {0!s}"        # Calls str() on the argument first
"Bring out the holy {name!r}"    # Calls repr() on the argument first
"More {!a}"                      # Calls ascii() on the argument first

format_spec 필드에는 필드 너비, 정렬, 패딩, 십진수 정밀도 등과 같은 세부 정보를 포함하여 값을 표시하는 방법에 대한 사양이 포함되어 있습니다. 각 값 유형은 자체 “포맷 미니 언어” 또는 format_spec의 해석을 정의할 수 있습니다.

대부분의 기본 제공 형식은 다음 섹션에서 설명하는 공통 서식 지정 미니 언어를 지원합니다.

format_spec 필드는 그 안에 중첩된 대체 필드를 포함할 수도 있습니다. 이러한 중첩된 대체 필드에는 필드 이름, 변환 플래그 및 형식 사양이 포함될 수 있지만 더 깊은 중첩은 허용되지 않습니다. format_spec 내의 대체 필드는 format_spec 문자열이 해석되기 전에 대체됩니다. 이렇게 하면 값의 서식을 동적으로 지정할 수 있습니다.

몇 가지 예는 형식 예 섹션을 참조하세요.

Format Specification Mini-Language

“형식 사양”은 개별 값이 표시되는 방법을 정의하기 위해 형식 문자열에 포함된 대체 필드 내에서 사용됩니다(형식 문자열 구문 및 형식 문자열 리터럴 참조). 내장 format() 함수에 직접 전달할 수도 있습니다. 각 형식 지정 유형은 형식 사양을 해석하는 방법을 정의할 수 있습니다.

대부분의 기본 제공 유형은 형식 사양에 대해 다음 옵션을 구현하지만 일부 형식 지정 옵션은 숫자 유형에서만 지원됩니다.

일반적으로 빈 형식 사양은 값에 대해 str()을 호출한 것과 동일한 결과를 생성합니다. 비어 있지 않은 형식 사양은 일반적으로 결과를 수정합니다.

표준 형식 지정자의 일반적인 형식은 다음과 같습니다.

format_spec     ::=  [[fill]align][sign][z][#][0][width][grouping_option][.precision][type]
fill            ::=  <any character>
align           ::=  "<" | ">" | "=" | "^"
sign            ::=  "+" | "-" | " "
width           ::=  digit+
grouping_option ::=  "_" | ","
precision       ::=  digit+
type            ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

유효한 정렬 값이 지정된 경우 모든 문자가 될 수 있는 채우기 문자가 앞에 올 수 있으며 생략된 경우 기본값은 공백입니다. 형식이 지정된 문자열 리터럴에서 또는 str.format() 메서드를 사용할 때 채우기 문자로 리터럴 중괄호(“{” 또는 “}”)를 사용할 수 없습니다. 그러나 중첩된 대체 필드가 있는 중괄호를 삽입할 수 있습니다. 이 제한은 format() 함수에 영향을 미치지 않습니다.

다양한 정렬 옵션의 의미는 다음과 같습니다.

OptionMeaning
'<'사용 가능한 공간 내에서 필드가 왼쪽 정렬되도록 합니다(대부분의 개체에 대한 기본값임).
'>'사용 가능한 공간 내에서 필드를 강제로 오른쪽 정렬합니다(숫자의 기본값).
'='패딩이 부호(있는 경우) 뒤, 숫자 앞에 배치되도록 합니다. 이것은 ‘+000000120’ 형식의 인쇄 필드에 사용됩니다. 이 정렬 옵션은 숫자 유형에만 유효합니다. 필드 너비 바로 앞에 ‘0’이 있으면 숫자의 기본값이 됩니다.
'^'사용 가능한 공간 내에서 필드가 중앙에 오도록 합니다.

최소 필드 너비가 정의되지 않은 경우 필드 너비는 항상 채울 데이터와 동일한 크기이므로 이 경우 정렬 옵션은 의미가 없습니다.

부호 옵션은 숫자 유형에만 유효하며 다음 중 하나일 수 있습니다.

OptionMeaning
'+'양수와 음수 모두에 부호를 사용해야 함을 나타냅니다.
'-'음수에만 부호를 사용해야 함을 나타냅니다(기본 동작임).
space양수에는 선행 공백을 사용하고 음수에는 빼기 기호를 사용해야 함을 나타냅니다.

‘z’ 옵션은 형식 정밀도로 반올림한 후 음수 0 부동 소수점 값을 양수 0으로 강제 변환합니다. 이 옵션은 부동 소수점 표시 유형에만 유효합니다.

버전 3.11에서 변경: ‘z’ 옵션을 추가했습니다(PEP 682도 참조).

‘#’ 옵션을 사용하면 “대체 형식”이 변환에 사용됩니다. 대체 양식은 유형에 따라 다르게 정의됩니다. 이 옵션은 정수, 실수 및 복합 유형에만 유효합니다. 정수의 경우 2진수, 8진수 또는 16진수 출력이 사용되는 경우 이 옵션은 각각의 접두사 ‘0b’, ‘0o’, ‘0x’ 또는 ‘0X’를 출력 값에 추가합니다. float 및 complex의 경우 대체 형식을 사용하면 뒤에 숫자가 없더라도 변환 결과에 항상 소수점 문자가 포함됩니다. 일반적으로 소수점 문자는 뒤에 숫자가 오는 경우에만 이러한 변환 결과에 나타납니다. 또한 ‘g’ 및 ‘G’ 변환의 경우 후행 0이 결과에서 제거되지 않습니다.

‘,’ 옵션은 천 단위 구분 기호로 쉼표를 사용했음을 나타냅니다. 로케일 인식 구분 기호의 경우 대신 ‘n’ 정수 표시 유형을 사용하십시오.

버전 3.1에서 변경: ‘,’ 옵션을 추가했습니다(PEP 378 참조).

‘_’ 옵션은 부동 소수점 표시 유형 및 정수 표시 유형 ‘d’에 대한 천 단위 구분 기호에 대한 밑줄 사용을 나타냅니다. 정수 표시 유형 ‘b’, ‘o’, ‘x’ 및 ‘X’의 경우 4자리마다 밑줄이 삽입됩니다. 다른 프레젠테이션 유형의 경우 이 옵션을 지정하는 것은 오류입니다.

버전 3.6에서 변경: ‘_’ 옵션을 추가했습니다(PEP 515도 참조).

너비는 접두사, 구분 기호 및 기타 서식 지정 문자를 포함하여 최소 전체 필드 너비를 정의하는 십진수 정수입니다. 지정하지 않으면 필드 너비는 내용에 따라 결정됩니다.

명시적인 정렬이 지정되지 않은 경우 너비 필드 앞에 0(‘0’) 문자를 추가하면 숫자 유형에 대한 부호 인식 제로 패딩이 활성화됩니다. 이는 정렬 유형이 ‘=’인 채움 문자 ‘0’과 동일합니다.

버전 3.10에서 변경: 너비 필드 앞에 ‘0’이 있어도 더 이상 문자열의 기본 정렬에 영향을 주지 않습니다.

정밀도는 프리젠테이션 유형 ‘f’ 및 ‘F’의 경우 소수점 뒤 또는 프리젠테이션 유형 ‘g’ 또는 ‘G’의 경우 소수점 전후에 표시되어야 하는 자릿수를 나타내는 십진 정수입니다. 문자열 표시 유형의 경우 필드는 최대 필드 크기, 즉 필드 콘텐츠에서 사용할 문자 수를 나타냅니다. 정수 표시 유형에는 정밀도가 허용되지 않습니다.

마지막으로 유형에 따라 데이터를 표시하는 방법이 결정됩니다.

사용 가능한 문자열 표시 유형은 다음과 같습니다.

TypeMeaning
's'문자열 형식. 문자열의 기본 유형이며 생략할 수 있습니다.
None‘s’와 동일합니다.

사용 가능한 정수 표시 유형은 다음과 같습니다.

TypeMeaning
'b'이진 형식. 2진법으로 숫자를 출력합니다.
'c'성격. 인쇄하기 전에 정수를 해당 유니코드 문자로 변환합니다.
'd'10진수 정수. 10진법으로 숫자를 출력합니다.
'o'8진수 형식. 8진법으로 숫자를 출력합니다.
'x'16진수 형식입니다. 9보다 큰 숫자에 소문자를 사용하여 16진법으로 숫자를 출력합니다.
'X'16진수 형식입니다. 16진법으로 숫자를 출력하며, 9이상의 숫자는 대문자를 사용합니다. ‘#’을 지정하면 접두사 ‘0x’도 ‘0X’로 대문자가 됩니다.
'n'숫자. 현재 로캘 설정을 사용하여 적절한 숫자 구분 문자를 삽입한다는 점을 제외하면 ‘d’와 동일합니다.
None‘d’와 동일합니다.

위의 표시 유형 외에도 정수는 아래에 나열된 부동 소수점 표시 유형으로 형식을 지정할 수 있습니다(‘n’ 및 없음 제외). 그렇게 할 때, float()는 서식을 지정하기 전에 정수를 부동 소수점 숫자로 변환하는 데 사용됩니다.

float 및 Decimal 값에 사용할 수 있는 표시 유형은 다음과 같습니다.

TypeMeaning
'e'과학적 표기법. 주어진 정밀도 p에 대해 지수에서 계수를 구분하는 문자 ‘e’를 사용하여 과학적 표기법으로 숫자의 형식을 지정합니다. 계수는 총 p + 1개의 유효 숫자에 대해 소수점 앞에 한 자리, 소수점 뒤에 p 자리가 있습니다. 정밀도가 지정되지 않은 경우 float에 대해 소수점 이하 6자리 정밀도를 사용하고 Decimal에 대해 모든 계수 자릿수를 표시합니다. 소수점 뒤에 숫자가 없으면 # 옵션을 사용하지 않는 한 소수점도 제거됩니다.
'E'과학적 표기법. 구분 문자로 대문자 ‘E’를 사용한다는 점을 제외하면 ‘e’와 동일합니다.
'f'고정 소수점 표기법. 주어진 정밀도 p에 대해 숫자를 소수점 뒤에 정확히 p 자리가 있는 십진수 형식으로 지정합니다. 정밀도가 지정되지 않은 경우 float에는 소수점 이하 6자리 정밀도를 사용하고 Decimal에는 모든 계수 자릿수를 표시할 수 있을 만큼 큰 정밀도를 사용합니다. 소수점 뒤에 숫자가 없으면 # 옵션을 사용하지 않는 한 소수점도 제거됩니다.
'F'고정 소수점 표기법. ‘f’와 동일하지만 nan을 NAN으로, inf를 INF로 변환합니다.
'g'일반 형식. 주어진 정밀도 p >= 1에 대해 숫자를 p 유효 숫자로 반올림한 다음 크기에 따라 결과를 고정 소수점 형식 또는 과학적 표기법으로 형식화합니다. 0의 정밀도는 1의 정밀도와 동일하게 취급됩니다. 정확한 규칙은 다음과 같습니다. 표시 유형 ‘e’ 및 정밀도 p-1로 형식화된 결과의 지수 지수가 있다고 가정합니다. 그런 다음 m <= exp < p인 경우(여기서 m은 float의 경우 -4이고 Decimals의 경우 -6임) 숫자는 표시 유형 ‘f’ 및 정밀도 p-1-exp로 형식이 지정됩니다. 그렇지 않으면 숫자는 표시 유형 ‘e’ 및 정밀도 p-1로 형식이 지정됩니다. 두 경우 모두 중요하지 않은 후행 0이 유효 숫자에서 제거되고 ‘#’ 옵션이 사용되지 않는 한 소수점 뒤에 남은 숫자가 없으면 소수점도 제거됩니다. 뜨다. Decimal의 경우 결과의 계수는 값의 계수 자릿수로 구성됩니다. 절대값이 1e-6보다 작은 값과 최하위 자릿수가 1보다 큰 값은 과학적 표기법을 사용하고 그 외에는 고정 소수점 표기법을 사용한다. 양수와 음수 무한대, 양수와 음수 0, 그리고 nans는 정밀도에 관계없이 각각 inf, -inf, 0, -0 및 nan으로 형식이 지정됩니다.
'G'일반 형식. 숫자가 너무 커지면 ‘E’로 전환된다는 점을 제외하면 ‘g’와 동일합니다. 무한대와 NaN의 표현도 대문자입니다.
'n'숫자. 현재 로케일 설정을 사용하여 적절한 숫자 구분 문자를 삽입한다는 점을 제외하면 ‘g’와 동일합니다.
'%'백분율. 숫자에 100을 곱하고 고정(‘f’) 형식으로 표시한 다음 백분율 기호를 표시합니다.
Nonefloat의 경우 이것은 고정 소수점 표기법을 사용하여 결과 형식을 지정하는 경우 항상 소수점 뒤에 하나 이상의 숫자를 포함한다는 점을 제외하면 ‘g’와 동일합니다. 사용된 정밀도는 주어진 값을 충실히 표현하는 데 필요한 만큼 큽니다. Decimal의 경우 이는 현재 십진 컨텍스트에 대한 context.capitals의 값에 따라 ‘g’ 또는 ‘G’와 동일합니다. 전반적인 효과는 다음과 같습니다. 다른 형식 수정자에 의해 변경된 대로 str()의 출력과 일치합니다.

Format examples

이 섹션에는 str.format() 구문의 예와 이전 %-포맷팅과의 비교가 포함되어 있습니다.

대부분의 경우 구문은 {}가 추가되고 % 대신 :이 사용되는 이전 %-포매팅과 유사합니다. 예를 들어 ‘%03.2f’는 ‘{:03.2f}’로 번역될 수 있습니다.

새 형식 구문은 다음 예제와 같이 새롭고 다양한 옵션도 지원합니다.

위치별로 인수에 액세스:

>>> '{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'
>>> '{}, {}, {}'.format('a', 'b', 'c')  # 3.1+ only
'a, b, c'
>>> '{2}, {1}, {0}'.format('a', 'b', 'c')
'c, b, a'
>>> '{2}, {1}, {0}'.format(*'abc')      # unpacking argument sequence
'c, b, a'
>>> '{0}{1}{0}'.format('abra', 'cad')   # arguments' indices can be repeated
'abracadabra'

이름으로 인수에 액세스:

>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'
>>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}
>>> 'Coordinates: {latitude}, {longitude}'.format(**coord)
'Coordinates: 37.24N, -115.81W'

인수 속성 액세스:

>>> c = 3-5j
>>> ('The complex number {0} is formed from the real part {0.real} '
...  'and the imaginary part {0.imag}.').format(c)
'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'
>>> class Point:
...     def __init__(self, x, y):
...         self.x, self.y = x, y
...     def __str__(self):
...         return 'Point({self.x}, {self.y})'.format(self=self)
... 
>>> str(Point(4, 2))
'Point(4, 2)'

인수 항목 액세스:

>>> coord = (3, 5)
>>> 'X: {0[0]};  Y: {0[1]}'.format(coord)
'X: 3;  Y: 5'

%s 와 %r 바꾸기:

>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')
"repr() shows quotes: 'test1'; str() doesn't: test2"

텍스트 정렬 및 너비 지정:

>>> '{:<30}'.format('left aligned')
'left aligned                  '
>>> '{:>30}'.format('right aligned')
'                 right aligned'
>>> '{:^30}'.format('centered')
'           centered           '
>>> '{:*^30}'.format('centered')  # use '*' as a fill char
'***********centered***********'

%+f, %-f 및 % f 교체 및 부호 지정:

>>> '{:+f}; {:+f}'.format(3.14, -3.14)  # show it always
'+3.140000; -3.140000'
>>> '{: f}; {: f}'.format(3.14, -3.14)  # show a space for positive numbers
' 3.140000; -3.140000'
>>> '{:-f}; {:-f}'.format(3.14, -3.14)  # show only the minus -- same as '{:f}; {:f}'
'3.140000; -3.140000'

%x 및 %o를 교체하고 값을 다른 기수로 변환:

>>> # format also supports binary numbers
>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> # with 0x, 0o, or 0b as prefix:
>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'

쉼표를 천 단위 구분 기호로 사용:

>>> '{:,}'.format(1234567890)
'1,234,567,890'

백분율 표현:

>>> points = 19
>>> total = 22
>>> 'Correct answers: {:.2%}'.format(points/total)
'Correct answers: 86.36%'

유형별 서식 사용:

>>> import datetime
>>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)
>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)
'2010-07-04 12:15:58'

중첩 인수 및 더 복잡한 예:

>>> for align, text in zip('<^>', ['left', 'center', 'right']):
...     '{0:{fill}{align}16}'.format(text, fill=align, align=align)
...
'left<<<<<<<<<<<<'
'^^^^^center^^^^^'
'>>>>>>>>>>>right'
>>>
>>> octets = [192, 168, 0, 1]
>>> '{:02X}{:02X}{:02X}{:02X}'.format(*octets)
'C0A80001'
>>> int(_, 16)
3232235521
>>>
>>> width = 5
>>> for num in range(5,12): 
...     for base in 'dXob':
...         print('{0:{width}{base}}'.format(num, base=base, width=width), end=' ')
...     print()
...
    5     5     5   101
    6     6     6   110
    7     7     7   111
    8     8    10  1000
    9     9    11  1001
   10     A    12  1010
   11     B    13  1011

Template strings

템플릿 문자열은 PEP 292에 설명된 대로 더 간단한 문자열 대체를 제공합니다. 템플릿 문자열의 기본 사용 사례는 국제화(i18n)입니다. 해당 컨텍스트에서 더 간단한 구문과 기능으로 인해 Python의 다른 내장된 문자열 서식 지정 기능보다 더 쉽게 번역할 수 있기 때문입니다. . i18n용 템플릿 문자열에 빌드된 라이브러리의 예는 flufl.i18n 패키지를 참조하십시오.

템플릿 문자열은 다음 규칙을 사용하여 $ 기반 대체를 지원합니다.

  • $$는 이스케이프입니다. 단일 $로 대체됩니다.
  • $identifier는 “식별자”의 매핑 키와 일치하는 대체 자리 표시자의 이름을 지정합니다. 기본적으로 “식별자”는 밑줄 또는 ASCII 문자로 시작하는 대소문자를 구분하지 않는 ASCII 영숫자 문자열(밑줄 포함)로 제한됩니다. $ 문자 다음의 첫 번째 비식별자 문자는 이 자리 표시자 사양을 종료합니다.
  • ${identifier}는 $identifier와 동일합니다. 유효한 식별자 문자가 자리 표시자 뒤에 있지만 “${noun}ification”과 같이 자리 표시자의 일부가 아닌 경우에 필요합니다.

문자열에 $가 다른 경우 ValueError가 발생합니다.

string 모듈은 이러한 규칙을 구현하는 템플릿 클래스를 제공합니다. 템플릿의 메서드는 다음과 같습니다.

class string.Template(template)

생성자는 템플릿 문자열인 단일 인수를 사용합니다.

substitute(mapping={}/**kwds)
템플릿 대체를 수행하여 새 문자열을 반환합니다. 매핑은 템플릿의 자리 표시자와 일치하는 키가 있는 사전과 같은 객체입니다. 또는 키워드가 자리 표시자인 키워드 인수를 제공할 수 있습니다. 매핑과 kwds가 모두 제공되고 중복 항목이 있는 경우 kwds의 자리 표시자가 우선합니다.

safe_substitute(mapping={}/**kwds)
플레이스홀더가 매핑 및 kwds에서 누락된 경우 KeyError 예외를 발생시키는 대신 원래 플레이스홀더가 결과 문자열에 그대로 나타납니다. 또한, replacement()와 달리 $의 다른 모든 모양은 ValueError를 발생시키는 대신 단순히 $를 반환합니다.

다른 예외가 여전히 발생할 수 있지만 이 메서드는 예외를 발생시키는 대신 항상 사용 가능한 문자열을 반환하려고 시도하기 때문에 “안전”하다고 합니다. 다른 의미에서 safe_substitute()는 매달려 있는 구분 기호, 일치하지 않는 중괄호 또는 유효한 Python 식별자가 아닌 자리 표시자를 포함하는 잘못된 형식의 템플릿을 자동으로 무시하기 때문에 safe가 아닌 다른 것일 수 있습니다.

is_valid()
템플릿에 잘못된 자리 표시자가 있으면 false를 반환하며, 이는 replacement()에서 ValueError를 발생시킵니다.

버전 3.11의 새로운 기능.

get_identifiers()
유효하지 않은 식별자는 무시하고 템플릿의 유효한 식별자 목록을 처음 나타나는 순서대로 반환합니다.

버전 3.11의 새로운 기능.

템플릿 인스턴스는 또한 하나의 공용 데이터 속성을 제공합니다.

template
이것은 생성자의 템플릿 인수에 전달되는 객체입니다. 일반적으로 변경하면 안 되지만 읽기 전용 액세스는 적용되지 않습니다.

다음은 템플릿을 사용하는 방법의 예입니다.

>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
>>> d = dict(who='tim')
>>> Template('Give $who $100').substitute(d)
Traceback (most recent call last):
...
ValueError: Invalid placeholder in string: line 1, col 11
>>> Template('$who likes $what').substitute(d)
Traceback (most recent call last):
...
KeyError: 'what'
>>> Template('$who likes $what').safe_substitute(d)
'tim likes $what

고급 사용: 템플릿의 하위 클래스를 파생하여 자리 표시자 구문, 구분 기호 또는 템플릿 문자열을 구문 분석하는 데 사용되는 전체 정규식을 사용자 지정할 수 있습니다. 이를 위해 다음 클래스 특성을 재정의할 수 있습니다.

  • delimiter – 이것은 구분 기호를 도입하는 자리 표시자를 설명하는 리터럴 문자열입니다. 기본값은 $입니다. 구현 시 필요에 따라 이 문자열에서 re.escape()를 호출하므로 정규 표현식이 아니어야 합니다. 클래스 생성 후에는 구분 기호를 변경할 수 없습니다(즉, 하위 클래스의 클래스 네임스페이스에 다른 구분 기호를 설정해야 함).
  • idpattern – 중괄호가 없는 자리 표시자의 패턴을 설명하는 정규식입니다. 기본값은 정규식(?a:[_a-z][_a-z0-9]*)입니다. 이것이 주어지고 braceidpattern이 None이면 이 패턴은 중괄호 자리 표시자에도 적용됩니다.

    참고 기본 플래그는 re.IGNORECASE이므로 패턴 [a-z]는 일부 비ASCII 문자와 일치할 수 있습니다. 이것이 우리가 여기서 로컬 a 플래그를 사용하는 이유입니다.

    버전 3.7에서 변경: braceidpattern은 중괄호 안팎에서 사용되는 별도의 패턴을 정의하는 데 사용할 수 있습니다.
  • braceidpattern – 이것은 idpattern과 유사하지만 중괄호 자리 표시자의 패턴을 설명합니다. 기본값은 idpattern으로 돌아가는 것을 의미하는 None입니다(즉, 중괄호 안팎에서 동일한 패턴이 사용됨). 주어진 경우, 중괄호와 중괄호가 없는 자리 표시자에 대해 서로 다른 패턴을 정의할 수 있습니다.

    버전 3.7의 새로운 기능.
  • flags – 대체 인식에 사용되는 정규식을 컴파일할 때 적용될 정규식 플래그입니다. 기본값은 re.IGNORECASE입니다. re.VERBOSE는 항상 플래그에 추가되므로 사용자 지정 idpatterns는 자세한 정규식에 대한 규칙을 따라야 합니다.

    버전 3.2의 새로운 기능.

또는 클래스 특성 패턴을 재정의하여 전체 정규식 패턴을 제공할 수 있습니다. 이 작업을 수행하는 경우 값은 4개의 명명된 캡처링 그룹이 있는 정규식 개체여야 합니다. 캡처 그룹은 잘못된 자리 표시자 규칙과 함께 위에 지정된 규칙에 해당합니다.

  • escaped – 이 그룹은 이스케이프 시퀀스와 일치합니다. $$, 기본 패턴.
  • named – 이 그룹은 중괄호가 없는 자리 표시자 이름과 일치합니다. 캡처 그룹에 구분 기호를 포함하면 안 됩니다.
  • braced – 이 그룹은 중괄호로 묶인 자리 표시자 이름과 일치합니다. 캡처 그룹에 구분 기호나 중괄호를 포함하면 안 됩니다.
  • invalid – 이 그룹은 다른 모든 구분 기호 패턴(일반적으로 단일 구분 기호)과 일치하며 정규식에서 마지막에 나타나야 합니다.

이 클래스의 메서드는 이름이 지정된 그룹 중 하나가 일치하지 않고 패턴이 템플릿과 일치하는 경우 ValueError를 발생시킵니다.

Helper functions

string.capwords(ssep=None)

str.split()을 사용하여 인수를 단어로 분할하고 str.capitalize()를 사용하여 각 단어를 대문자로 표시하고 str.join()을 사용하여 대문자로 표시된 단어를 연결합니다. 선택적 두 번째 인수 sep가 없거나 None이면 공백 문자가 단일 공백으로 대체되고 선행 및 후행 공백이 제거됩니다. 그렇지 않으면 sep를 사용하여 단어를 분할하고 결합합니다.

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

Text Processing Services

이 장에서 설명하는 모듈은 광범위한 문자열 조작 작업 및 기타 텍스트 처리 서비스를 제공합니다.

Binary Data Services에서 설명하는 코덱 모듈은 텍스트 처리와도 매우 관련이 있습니다. 또한 Text Sequence Type — str에서 Python의 내장 문자열 유형에 대한 설명서를 참조하십시오.

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

Built-in Exceptions

Python에서 모든 예외는 BaseException에서 파생되는 클래스의 인스턴스여야 합니다. 특정 클래스를 언급하는 except 절이 있는 try 문에서 해당 절은 해당 클래스에서 파생된 모든 예외 클래스도 처리합니다(단, 파생된 예외 클래스는 아님). 서브클래싱을 통해 관련되지 않은 두 예외 클래스는 이름이 같더라도 결코 동일하지 않습니다.

아래에 나열된 기본 제공 예외는 인터프리터 또는 기본 제공 함수에 의해 생성될 수 있습니다. 언급된 경우를 제외하고 오류의 자세한 원인을 나타내는 “연관된 값”이 있습니다. 이것은 문자열이거나 여러 정보 항목의 튜플(예: 오류 코드 및 코드를 설명하는 문자열)일 수 있습니다. 연관된 값은 일반적으로 예외 클래스의 생성자에 대한 인수로 전달됩니다.

사용자 코드는 기본 제공 예외를 발생시킬 수 있습니다. 이는 예외 처리기를 테스트하거나 인터프리터가 동일한 예외를 발생시키는 상황과 “같은” 오류 조건을 보고하는 데 사용할 수 있습니다. 그러나 사용자 코드가 부적절한 오류를 발생시키는 것을 막을 방법이 없다는 점에 유의하십시오.

내장된 예외 클래스는 새 예외를 정의하기 위해 서브클래싱될 수 있습니다. 프로그래머는 BaseException이 아닌 Exception 클래스 또는 하위 클래스 중 하나에서 새 예외를 파생시키는 것이 좋습니다. 예외 정의에 대한 자세한 내용은 Python 자습서의 사용자 정의 예외에서 확인할 수 있습니다.

Exception context

다른 예외가 이미 처리되고 있는 동안 새 예외를 발생시키면 새 예외의 __context__ 속성이 자동으로 처리된 예외로 설정됩니다. except나 finally 절, with 문이 사용될 때 예외가 처리될 수 있습니다.

이 암시적 예외 컨텍스트는 from을 raise와 함께 사용하여 명시적 원인으로 보완할 수 있습니다.

raise new_exc from original_exc

from 다음의 표현식은 예외이거나 None이어야 합니다. 발생한 예외에 대해 __cause__로 설정됩니다. __cause__를 설정하면 암시적으로 __suppress_context__ 속성이 True로 설정되므로, raise new_exc from None을 사용하면 표시 목적(예: KeyError를 AttributeError로 변환)을 위해 이전 예외를 새 예외로 효과적으로 대체하는 한편 디버깅 시 검사를 위해 __context__에서 이전 예외를 사용할 수 있습니다. .

기본 트레이스백 표시 코드는 예외 자체에 대한 트레이스백 외에도 이러한 연결된 예외를 보여줍니다. __cause__에 명시적으로 연결된 예외가 있으면 항상 표시됩니다. __context__의 암시적으로 연결된 예외는 __cause__가 None이고 __suppress_context__가 false인 경우에만 표시됩니다.

어느 경우든 예외 자체는 항상 연결된 예외 뒤에 표시되므로 트레이스백의 마지막 줄이 항상 발생한 마지막 예외를 표시합니다.

Inheriting from built-in exceptions

사용자 코드는 예외 유형에서 상속되는 하위 클래스를 만들 수 있습니다. 베이스가 args 속성을 처리하는 방법과 메모리 레이아웃 비호환성으로 인한 충돌 가능성을 피하기 위해 한 번에 하나의 예외 유형만 하위 클래스로 만드는 것이 좋습니다.

CPython 구현 세부 사항: 대부분의 내장 예외는 효율성을 위해 C로 구현됩니다. Objects/exceptions.c를 참조하십시오. 일부는 여러 예외 유형에서 상속되는 하위 클래스를 만드는 것을 불가능하게 만드는 사용자 정의 메모리 레이아웃을 가지고 있습니다. 유형의 메모리 레이아웃은 구현 세부 사항이며 Python 버전 간에 변경되어 향후 새로운 충돌로 이어질 수 있습니다. 따라서 여러 예외 유형을 함께 서브클래싱하지 않는 것이 좋습니다.

Base classes

다음 예외는 대부분 다른 예외의 기본 클래스로 사용됩니다.

exception BaseException

모든 기본 제공 예외의 기본 클래스입니다. 사용자 정의 클래스에 의해 직접 상속되는 것은 아닙니다(이를 위해 Exception 사용). 이 클래스의 인스턴스에서 str()이 호출되면 인스턴스에 대한 인수의 표현이 반환되거나 인수가 없는 경우 빈 문자열이 반환됩니다.

args
예외 생성자에 제공된 인수 튜플입니다. 일부 기본 제공 예외(예: OSError)는 특정 수의 인수를 예상하고 이 튜플의 요소에 특별한 의미를 할당하는 반면, 다른 예외는 일반적으로 오류 메시지를 제공하는 단일 문자열로만 호출됩니다.

with_traceback(tb)
이 메소드는 tb를 예외에 대한 새로운 트레이스백으로 설정하고 예외 객체를 반환합니다. PEP 3134의 예외 연결 기능을 사용할 수 있게 되기 전에 더 일반적으로 사용되었습니다. 다음 예제는 트레이스백을 유지하면서 SomeException 인스턴스를 OtherException 인스턴스로 변환하는 방법을 보여줍니다. 제기되면 현재 프레임은 OtherException의 트레이스백으로 푸시됩니다. 이는 원래 SomeException의 트레이스백이 호출자에게 전파되도록 허용한 경우 발생했을 것입니다.

try:
    ...
except SomeException:
    tb = sys.exc_info()[2]
    raise OtherException(...).with_traceback(tb)

add_note(note)
예외 문자열 뒤의 표준 트레이스백에 나타나는 예외 노트에 문자열 노트를 추가합니다. note가 문자열이 아니면 TypeError가 발생합니다.

버전 3.11의 새로운 기능.

__notes__
add_note()로 추가된 이 예외의 메모 목록입니다. 이 속성은 add_note()가 호출될 때 생성됩니다.

버전 3.11의 새로운 기능.

exception Exception

시스템 종료가 아닌 기본 제공 예외는 모두 이 클래스에서 파생됩니다. 모든 사용자 정의 예외도 이 클래스에서 파생되어야 합니다.

exception ArithmeticError

다양한 산술 오류에 대해 발생하는 내장 예외의 기본 클래스: OverflowError, ZeroDivisionError, FloatingPointError.

exception BufferError

버퍼 관련 작업을 수행할 수 없을 때 발생합니다.

exception LookupError

매핑이나 시퀀스에 사용된 키나 인덱스가 유효하지 않을 때 발생하는 예외의 기본 클래스: IndexError, KeyError. 이것은 codecs.lookup()에 의해 직접 발생할 수 있습니다.

Concrete exceptions

다음 예외는 일반적으로 발생하는 예외입니다.

exception AssertionError
assert 문이 실패할 때 발생합니다.

exception AttributeError
속성 참조(속성 참조 참조) 또는 할당이 실패할 때 발생합니다. (객체가 속성 참조나 속성 할당을 전혀 지원하지 않으면 TypeError가 발생합니다.)

name 및 obj 특성은 생성자에 대한 키워드 전용 인수를 사용하여 설정할 수 있습니다. 설정되면 각각 액세스를 시도한 속성의 이름과 해당 속성에 대해 액세스한 객체를 나타냅니다.

버전 3.10에서 변경: name 및 obj 속성을 추가했습니다.

exception EOFError
input() 함수가 데이터를 읽지 않고 파일 끝 조건(EOF)에 도달하면 발생합니다. (주의: io.IOBase.read() 및 io.IOBase.readline() 메서드는 EOF에 도달하면 빈 문자열을 반환합니다.)

exception FloatingPointError
현재 사용되지 않습니다.

exception GeneratorExit
제너레이터 또는 코루틴이 닫힐 때 발생합니다. generator.close() 및 coroutine.close()를 참조하십시오. 기술적으로 오류가 아니기 때문에 Exception 대신 BaseException에서 직접 상속합니다.

exception ImportError
import 문이 모듈을 로드하는 데 문제가 있을 때 발생합니다. from … import의 “from list”에 찾을 수 없는 이름이 있는 경우에도 발생합니다.

이름 및 경로 특성은 생성자에 대한 키워드 전용 인수를 사용하여 설정할 수 있습니다. 설정되면 가져오기를 시도한 모듈의 이름과 예외를 트리거한 파일의 경로를 각각 나타냅니다.

버전 3.3에서 변경: 이름 및 경로 속성을 추가했습니다.

exception ModuleNotFoundError
모듈을 찾을 수 없을 때 가져오기에 의해 발생하는 ImportError 의 하위 클래스입니다. sys.modules에서 None이 발견될 때도 발생합니다.

버전 3.6의 새로운 기능.

exception IndexError
시퀀스 첨자가 범위를 벗어날 때 발생합니다. (슬라이스 인덱스는 허용된 범위에 속하도록 자동으로 잘립니다. 인덱스가 정수가 아니면 TypeError가 발생합니다.)

exception KeyError
기존 키 집합에서 매핑(사전) 키를 찾을 수 없을 때 발생합니다.

exception KeyboardInterrupt
사용자가 인터럽트 키(일반적으로 Control-C 또는 Delete)를 눌렀을 때 발생합니다. 실행 중에 정기적으로 인터럽트를 확인합니다. 예외는 Exception을 포착하는 코드에 실수로 포착되지 않도록 BaseException에서 상속되어 인터프리터가 종료되는 것을 방지합니다.

참고 KeyboardInterrupt를 포착하려면 특별한 고려가 필요합니다. 예측할 수 없는 지점에서 발생할 수 있기 때문에 경우에 따라 실행 중인 프로그램이 일관성 없는 상태로 남을 수 있습니다. 일반적으로 KeyboardInterrupt가 가능한 한 빨리 프로그램을 종료하도록 허용하거나 완전히 발생시키지 않는 것이 가장 좋습니다. (신호 처리기 및 예외에 대한 참고 사항을 참조하십시오.)

exception MemoryError
작업의 메모리가 부족하지만 상황이 여전히 복구될 수 있을 때 발생합니다(일부 객체를 삭제하여). 관련 값은 메모리가 부족한 (내부) 작업의 종류를 나타내는 문자열입니다. 기본 메모리 관리 아키텍처(C의 malloc() 함수) 때문에 인터프리터가 항상 이 상황에서 완전히 복구할 수 있는 것은 아닙니다. 그럼에도 불구하고 폭주 프로그램이 원인인 경우 스택 트레이스백을 인쇄할 수 있도록 예외를 발생시킵니다.

exception NameError
로컬 또는 전역 이름을 찾을 수 없을 때 발생합니다. 이는 규정되지 않은 이름에만 적용됩니다. 연관된 값은 찾을 수 없는 이름을 포함하는 오류 메시지입니다.

name 특성은 생성자에 대한 키워드 전용 인수를 사용하여 설정할 수 있습니다. 설정되면 액세스를 시도한 변수의 이름을 나타냅니다.

버전 3.10에서 변경: 이름 속성을 추가했습니다.

exception NotImplementedError
이 예외는 RuntimeError에서 파생됩니다. 사용자 정의 기본 클래스에서 추상 메서드는 메서드를 재정의하기 위해 파생 클래스가 필요하거나 실제 구현을 추가해야 함을 나타내기 위해 클래스가 개발되는 동안 이 예외를 발생시켜야 합니다.

참고 연산자나 메서드가 전혀 지원되지 않음을 나타내기 위해 사용해서는 안 됩니다. 이 경우 연산자/메서드를 정의되지 않은 상태로 두거나 하위 클래스인 경우 None으로 설정하십시오.

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

exception OSError([arg])
exception OSError(errno, strerror[, filename[, winerror[, filename2]]])

예외 OSError(errno, strerror[, 파일 이름[, winerror[, 파일 이름2]]])
이 예외는 시스템 함수가 “파일을 찾을 수 없음” 또는 “디스크 가득 참”(잘못된 인수 유형 또는 기타 부수적인 오류가 아님)과 같은 I/O 실패를 포함하여 시스템 관련 오류를 반환할 때 발생합니다.

생성자의 두 번째 형식은 아래에 설명된 해당 특성을 설정합니다. 지정되지 않은 경우 속성은 기본적으로 없음으로 설정됩니다. 이전 버전과의 호환성을 위해 세 개의 인수가 전달되면 args 특성에는 처음 두 생성자 인수의 2-튜플만 포함됩니다.

생성자는 실제로 i에서 설명한 것처럼 실제로 OSError의 하위 클래스를 반환하는 경우가 많습니다.

errno
C 변수 errno의 숫자 오류 코드입니다.

winerror
Windows에서는 기본 Windows 오류 코드를 제공합니다. 그런 다음 errno 속성은 해당 네이티브 오류 코드를 POSIX 용어로 대략적으로 번역한 것입니다.

Windows에서 winerror 생성자 인수가 정수인 경우 errno 속성은 Windows 오류 코드에서 결정되며 errno 인수는 무시됩니다. 다른 플랫폼에서는 winerror 인수가 무시되고 winerror 속성이 존재하지 않습니다.

strerror
운영 체제에서 제공하는 해당 오류 메시지. POSIX에서는 C 함수 perror()로, Windows에서는 FormatMessage()로 포맷됩니다.

filename
filename2
파일 시스템 경로(예: open() 또는 os.unlink())와 관련된 예외의 경우 filename은 함수에 전달된 파일 이름입니다. 두 개의 파일 시스템 경로(예: os.rename())가 포함된 함수의 경우 filename2는 함수에 전달된 두 번째 파일 이름에 해당합니다.

버전 3.3에서 변경: EnvironmentError, IOError, WindowsError, socket.error, select.error 및 mmap.error가 OSError로 병합되었으며 생성자는 하위 클래스를 반환할 수 있습니다.

버전 3.4에서 변경: filename 속성은 이제 파일 시스템 인코딩 및 오류 처리기에서 인코딩되거나 디코딩된 이름 대신 함수에 전달된 원래 파일 이름입니다. 또한 filename2 생성자 인수 및 속성이 추가되었습니다.

exception OverflowError

산술 연산의 결과가 너무 커서 표현할 수 없을 때 발생합니다. 이것은 정수에 대해서는 발생할 수 없습니다(포기하는 것보다 MemoryError를 발생시키는 것이 좋습니다). 그러나 역사적 이유로 필요한 범위를 벗어난 정수에 대해 OverflowError가 발생하는 경우가 있습니다. C에서 부동 소수점 예외 처리의 표준화가 부족하기 때문에 대부분의 부동 소수점 연산이 검사되지 않습니다.

exception RecursionError

이 예외는 RuntimeError에서 파생됩니다. 인터프리터가 최대 재귀 깊이(sys.getrecursionlimit() 참조)를 초과했음을 감지하면 발생합니다.

버전 3.5의 새로운 기능: 이전에는 일반 RuntimeError가 발생했습니다.

exception ReferenceError

이 예외는 weakref.proxy() 함수에 의해 생성된 약한 참조 프록시가 가비지 수집된 후 참조 대상의 속성에 액세스하는 데 사용될 때 발생합니다. 약한 참조에 대한 자세한 내용은 weakref 모듈을 참조하세요.

exception RuntimeError

다른 범주에 속하지 않는 오류가 감지될 때 발생합니다. 관련 값은 정확히 무엇이 잘못되었는지 나타내는 문자열입니다.

exception StopIteration

내장 함수 next()와 반복자의 __next__() 메서드에 의해 발생하여 반복자가 생성한 항목이 더 이상 없다는 신호를 보냅니다.

예외 개체에는 예외를 생성할 때 인수로 제공되는 단일 속성 값이 있으며 기본값은 None입니다.

생성기 또는 코루틴 함수가 반환되면 새 StopIteration 인스턴스가 발생하고 함수에서 반환된 값이 예외 생성자에 대한 값 매개 변수로 사용됩니다.

생성기 코드가 직접 또는 간접적으로 StopIteration을 발생시키면 RuntimeError로 변환됩니다(StopIteration을 새 예외의 원인으로 유지).

버전 3.3에서 변경: 값 속성을 추가하고 생성기 함수가 값을 반환하는 데 사용할 수 있는 기능을 추가했습니다.

버전 3.5에서 변경: from __future__ import generator_stop을 통해 RuntimeError 변환을 도입했습니다(PEP 479 참조).

버전 3.7에서 변경: 기본적으로 모든 코드에 대해 PEP 479를 활성화합니다. 생성기에서 발생하는 StopIteration 오류는 RuntimeError로 변환됩니다.

exception StopAsyncIteration

반복을 중지하려면 비동기 이터레이터 객체의 __anext__() 메서드에 의해 발생되어야 합니다.

버전 3.5의 새로운 기능.

exception SyntaxError(messagedetails)

예외 SyntaxError(메시지, 세부 정보)
구문 분석기가 구문 오류를 발견하면 발생합니다. 이는 import 문, 내장 함수 compile(), exec() 또는 eval() 호출에서 또는 초기 스크립트 또는 표준 입력을 읽을 때(역시 대화식으로) 발생할 수 있습니다.

예외 인스턴스의 str()은 오류 메시지만 반환합니다. Details는 멤버가 별도의 속성으로도 사용 가능한 튜플입니다.

filename
구문 오류가 발생한 파일의 이름입니다.

lineno
오류가 발생한 파일의 줄 번호입니다. 이것은 1-색인입니다. 파일의 첫 번째 줄에는 lineno가 1입니다.

offset
오류가 발생한 줄의 열입니다. 이것은 1-인덱스입니다: 라인의 첫 번째 문자는 1의 오프셋을 가집니다.

text
오류와 관련된 소스 코드 텍스트입니다.

end_lineno
오류가 발생한 파일의 라인 번호가 끝나는 줄

end_offset
오류가 발생한 끝 줄의 열이 끝납니다. 이것은 1-인덱스입니다: 라인의 첫 번째 문자는 1의 오프셋을 가집니다.

f-문자열 필드 오류의 경우 메시지 앞에 “f-string:”이 붙고 오프셋은 대체 표현식에서 구성된 텍스트의 오프셋입니다. 예를 들어 f’Bad {a b} 필드’를 컴파일하면 다음 인수 a가 됩니다.

버전 3.10에서 변경: end_lineno 및 end_offset 속성을 추가했습니다.

exception IndentationError

잘못된 들여쓰기와 관련된 구문 오류의 기본 클래스입니다. 이것은 SyntaxError의 하위 클래스입니다.

exception TabError

들여쓰기에 탭과 공백이 일관되지 않게 사용되었을 때 발생합니다. 이것은 IndentationError의 하위 클래스입니다.

exception SystemError

인터프리터가 내부 오류를 발견했지만 모든 희망을 포기할 정도로 상황이 심각해 보이지 않을 때 발생합니다. 연결된 값은 무엇이 잘못되었는지 나타내는 문자열입니다(낮은 수준의 용어로).

Python 인터프리터의 작성자 또는 관리자에게 이를 보고해야 합니다. Python 인터프리터의 버전(sys.version; 대화식 Python 세션 시작 시에도 인쇄됨), 정확한 오류 메시지(예외 관련 값) 및 가능한 경우 오류를 트리거한 프로그램의 소스를 보고해야 합니다. 오류.

exception SystemExit

이 예외는 sys.exit() 함수에 의해 발생합니다. Exception을 catch하는 코드에 실수로 catch되지 않도록 Exception 대신 BaseException에서 상속합니다. 이렇게 하면 예외가 제대로 전파되어 인터프리터가 종료될 수 있습니다. 처리되지 않으면 Python 인터프리터가 종료됩니다. 스택 트레이스백이 인쇄되지 않습니다. 생성자는 sys.exit()에 전달된 것과 동일한 선택적 인수를 허용합니다. 값이 정수이면 시스템 종료 상태를 지정합니다(C의 exit() 함수에 전달됨). None이면 종료 상태는 0입니다. 다른 유형(예: 문자열)이 있는 경우 객체의 값이 인쇄되고 종료 상태는 1입니다.

sys.exit()에 대한 호출은 예외로 변환되어 정리 처리기(마지막으로 try 문의 절)를 실행할 수 있고 디버거가 통제력을 잃지 않고 스크립트를 실행할 수 있습니다. os._exit() 함수는 즉시 종료하는 것이 절대적으로 필요한 경우에 사용할 수 있습니다(예: os.fork() 호출 후 자식 프로세스에서).

code
생성자에게 전달되는 종료 상태 또는 오류 메시지입니다. (기본값은 없음입니다.)

exception TypeError

연산이나 함수가 부적절한 유형의 객체에 적용될 때 발생합니다. 관련 값은 유형 불일치에 대한 세부 정보를 제공하는 문자열입니다.

이 예외는 개체에 대한 시도된 작업이 지원되지 않으며 지원되지 않음을 나타내기 위해 사용자 코드에 의해 발생할 수 있습니다. 개체가 주어진 작업을 지원하기 위한 것이지만 아직 구현을 제공하지 않은 경우 NotImplementedError를 발생시키는 적절한 예외입니다.

잘못된 유형의 인수를 전달하면(예: int가 예상될 때 목록을 전달하는 경우) TypeError가 발생하지만 잘못된 값(예: 예상 범위를 벗어난 숫자)이 있는 인수를 전달하면 ValueError가 발생해야 합니다.

exception UnboundLocalError

함수나 메서드에서 지역 변수에 대한 참조가 만들어졌지만 해당 변수에 바인딩된 값이 없을 때 발생합니다. 이것은 NameError의 하위 클래스입니다.

exception UnicodeError

유니코드 관련 인코딩 또는 디코딩 오류가 발생할 때 발생합니다. ValueError의 하위 클래스입니다.

UnicodeError에는 인코딩 또는 디코딩 오류를 설명하는 특성이 있습니다. 예를 들어 err.object[err.start:err.end]는 코덱이 실패한 특정 잘못된 입력을 제공합니다.

encoding
오류를 발생시킨 인코딩의 이름입니다.

reason
특정 코덱 오류를 설명하는 문자열입니다.

object
코덱이 인코딩 또는 디코딩을 시도한 개체입니다.

start
개체에 있는 잘못된 데이터의 첫 번째 인덱스입니다.

end
개체의 마지막 유효하지 않은 데이터 뒤의 인덱스입니다.

exception UnicodeEncodeError

인코딩 중에 유니코드 관련 오류가 발생하면 발생합니다. UnicodeError의 하위 클래스입니다.

exception UnicodeDecodeError

디코딩 중에 유니코드 관련 오류가 발생하면 발생합니다. UnicodeError의 하위 클래스입니다.

exception UnicodeTranslateError

번역 중에 유니코드 관련 오류가 발생하면 발생합니다. UnicodeError의 하위 클래스입니다.

exception ValueError

연산이나 함수가 올바른 유형이지만 부적절한 값을 가진 인수를 받고 상황이 IndexError와 같은 더 정확한 예외로 설명되지 않을 때 발생합니다.

exception ZeroDivisionError

나누기 또는 모듈로 연산의 두 번째 인수가 0일 때 발생합니다. 연결된 값은 피연산자와 연산의 유형을 나타내는 문자열입니다.

이전 버전과의 호환성을 위해 다음 예외가 유지됩니다. Python 3.3부터는 OSError의 별칭입니다.

exception EnvironmentError
exception IOError
exception WindowsError

Windows에서만 사용할 수 있습니다.

OS exceptions

다음 예외는 OSError의 하위 클래스이며 시스템 오류 코드에 따라 발생합니다.

exception BlockingIOError

비차단 작업으로 설정된 객체(예: 소켓)에서 작업이 차단될 때 발생합니다. errno EAGAIN, EALREADY, EWOULDBLOCK 및 EINPROGRESS에 해당합니다.

OSError 외에도 BlockingIOError에는 속성이 하나 더 있을 수 있습니다.

characters_written
스트림이 차단되기 전에 스트림에 기록된 문자 수를 포함하는 정수입니다. 이 속성은 io 모듈에서 버퍼링된 I/O 클래스를 사용할 때 사용할 수 있습니다.

exception ChildProcessError

자식 프로세스에 대한 작업이 실패하면 발생합니다. errno ECHILD에 해당합니다.

exception ConnectionError

연결 관련 문제에 대한 기본 클래스입니다.

하위 클래스는 BrokenPipeErrorConnectionAbortedErrorConnectionRefusedError and ConnectionResetError입니다.

exception BrokenPipeError

다른 쪽 끝이 닫힌 상태에서 파이프에 쓰기를 시도하거나 쓰기를 위해 종료된 소켓에 쓰기를 시도할 때 발생하는 ConnectionError의 하위 클래스입니다. errno EPIPE 및 ESHUTDOWN에 해당합니다.

exception ConnectionAbortedError

연결 시도가 피어에 의해 중단될 때 발생하는 ConnectionError의 하위 클래스입니다. errno ECONNABORTED에 해당합니다.

exception ConnectionRefusedError

피어에서 연결 시도를 거부할 때 발생하는 ConnectionError의 하위 클래스입니다. errno ECONNREFUSED에 해당합니다.

exception ConnectionResetError

연결이 피어에 의해 재설정될 때 발생하는 ConnectionError의 하위 클래스입니다. errno ECONNRESET에 해당합니다.

exception FileExistsError

이미 존재하는 파일이나 디렉터리를 만들려고 할 때 발생합니다. errno EEXIST에 해당합니다.

exception FileNotFoundError

파일이나 디렉토리가 요청되었지만 존재하지 않을 때 발생합니다. errno ENOENT에 해당합니다.

exception InterruptedError

들어오는 신호에 의해 시스템 호출이 중단될 때 발생합니다. errno EINTR에 해당합니다.

버전 3.5에서 변경: 신호 처리기가 InterruptedError를 발생시키는 대신 예외를 발생시키는 경우(이유는 PEP 475 참조)를 제외하고는 신호에 의해 시스템 호출이 중단될 때 Python이 이제 시스템 호출을 재시도합니다.

exception IsADirectoryError

디렉터리에서 파일 작업(예: os.remove())이 요청될 때 발생합니다. errno EISDIR에 해당합니다.

exception NotADirectoryError

디렉터리 작업(예: os.listdir())이 디렉터리가 아닌 항목에서 요청될 때 발생합니다. 대부분의 POSIX 플랫폼에서 작업이 디렉터리가 아닌 파일을 마치 디렉터리인 것처럼 열거나 통과하려고 시도하는 경우에도 발생할 수 있습니다. errno ENOTDIR에 해당합니다.

exception PermissionError

적절한 액세스 권한(예: 파일 시스템 권한) 없이 작업을 실행하려고 할 때 발생합니다. errno EACCES, EPERM 및 ENOTCAPABLE에 해당합니다.

버전 3.11.1에서 변경: WASI의 ENOTCAPABLE이 이제 PermissionError에 매핑됩니다.

exception ProcessLookupError

주어진 프로세스가 존재하지 않을 때 발생합니다. errno ESRCH에 해당합니다.

exception TimeoutError

시스템 기능이 시스템 수준에서 시간 초과되었을 때 발생합니다. errno ETIMEDOUT에 해당합니다.

버전 3.3의 새로운 기능: 위의 모든 OSError 하위 클래스가 추가되었습니다.

PEP 3151 – OS 및 IO 예외 계층 재작업도 참조하십시오.

Warnings

다음 예외는 경고 범주로 사용됩니다. 자세한 내용은 경고 범주 설명서를 참조하십시오.

exception Warning

경고 범주의 기본 클래스입니다.

exception UserWarning

사용자 코드에서 생성된 경고의 기본 클래스입니다.

exception DeprecationWarning

더 이상 사용되지 않는 기능에 대한 경고가 다른 Python 개발자를 위한 것일 때 해당 경고의 기본 클래스입니다.

__main__ 모듈(PEP 565)을 제외하고 기본 경고 필터에 의해 무시됩니다. Python 개발 모드를 활성화하면 이 경고가 표시됩니다.

폐기 정책은 PEP 387에 설명되어 있습니다.

exception PendingDeprecationWarning

더 이상 사용되지 않고 향후 사용되지 않을 것으로 예상되지만 현재 사용되지 않는 기능에 대한 경고의 기본 클래스입니다.

이 클래스는 곧 있을 지원 중단 가능성에 대한 경고를 내보내는 것이 일반적이지 않기 때문에 거의 사용되지 않으며 DeprecationWarning은 이미 활성화된 지원 중단에 선호됩니다.

기본 경고 필터에 의해 무시됩니다. Python 개발 모드를 활성화하면 이 경고가 표시됩니다.

폐기 정책은 PEP 387에 설명되어 있습니다.

exception SyntaxWarning

모호한 구문에 대한 경고의 기본 클래스입니다.

exception RuntimeWarning

의심스러운 런타임 동작에 대한 경고의 기본 클래스입니다.

exception FutureWarning

더 이상 사용되지 않는 기능에 대한 경고가 Python으로 작성된 애플리케이션의 최종 사용자를 대상으로 하는 경우 해당 경고의 기본 클래스입니다.

exception ImportWarning

모듈 가져오기의 가능한 실수에 대한 경고의 기본 클래스입니다.

기본 경고 필터에 의해 무시됩니다. Python 개발 모드를 활성화하면 이 경고가 표시됩니다.

exception UnicodeWarning

유니코드와 관련된 경고의 기본 클래스입니다.

exception EncodingWarning

인코딩과 관련된 경고의 기본 클래스입니다.

자세한 내용은 옵트인 EncodingWarning을 참조하십시오.

버전 3.10의 새로운 기능.

exception BytesWarning

바이트 및 바이트 배열과 관련된 경고의 기본 클래스입니다.

exception ResourceWarning

리소스 사용과 관련된 경고의 기본 클래스입니다.

기본 경고 필터에 의해 무시됩니다. Python 개발 모드를 활성화하면 이 경고가 표시됩니다.

버전 3.2의 새로운 기능.

Exception groups

다음은 관련 없는 여러 예외를 발생시켜야 할 때 사용됩니다. 예외 계층의 일부이므로 다른 모든 예외와 마찬가지로 예외로 처리할 수 있습니다. 또한 포함된 예외 유형에 따라 하위 그룹을 일치시키는 except*에 의해 인식됩니다.

exception ExceptionGroup(msgexcs)
exception BaseExceptionGroup(msgexcs)

이러한 예외 유형은 모두 예외를 시퀀스 excs로 래핑합니다. msg 매개변수는 문자열이어야 합니다. 두 클래스의 차이점은 BaseExceptionGroup은 BaseException을 확장하고 모든 예외를 래핑할 수 있는 반면 ExceptionGroup은 Exception을 확장하고 Exception의 하위 클래스만 래핑할 수 있다는 것입니다. 이 디자인은 Exception이 BaseExceptionGroup이 아닌 ExceptionGroup을 포착하도록 설계되었습니다.

BaseExceptionGroup 생성자는 포함된 모든 예외가 Exception 인스턴스인 경우 BaseExceptionGroup이 아닌 ExceptionGroup을 반환하므로 선택을 자동으로 만드는 데 사용할 수 있습니다. 반면에 ExceptionGroup 생성자는 포함된 예외가 Exception 하위 클래스가 아닌 경우 TypeError를 발생시킵니다.

message
생성자에 대한 msg 인수입니다. 이것은 읽기 전용 속성입니다.

exceptions
생성자에게 주어진 excs 시퀀스의 예외 튜플. 이것은 읽기 전용 속성입니다.

subgroup(condition)
조건과 일치하는 현재 그룹의 예외만 포함하는 예외 그룹을 반환하거나 결과가 비어 있으면 None을 반환합니다.

조건은 예외를 수락하고 하위 그룹에 있어야 하는 항목에 대해 true를 반환하는 함수이거나 예외 유형 또는 예외 유형의 튜플일 수 있습니다. except 절에서 사용됩니다.

현재 예외의 중첩 구조는 메시지, __traceback__, __cause__, __context__ 및 __notes__ 필드의 값과 마찬가지로 결과에 보존됩니다. 빈 중첩 그룹은 결과에서 생략됩니다.

최상위 수준 및 모든 중첩된 예외 그룹을 포함하여 중첩된 예외 그룹의 모든 예외에 대해 조건이 확인됩니다. 이러한 예외 그룹에 대해 조건이 참이면 전체 결과에 포함됩니다.

split(condition)
subgroup()과 비슷하지만 일치가 하위 그룹(조건)이고 나머지가 일치하지 않는 나머지 부분인 쌍(일치, 나머지)을 반환합니다.

derive(excs)
동일한 메시지가 포함된 예외 그룹을 반환하지만 예외를 excs로 래핑합니다.

이 메서드는 subgroup() 및 split()에서 사용됩니다. subgroup() 및 split()이 ExceptionGroup이 아닌 하위 클래스의 인스턴스를 반환하도록 하려면 하위 클래스가 이를 재정의해야 합니다.

subgroup() 및 split()은 원래 예외 그룹의 __traceback__, __cause__, __context__ 및 __notes__ 필드를 Derive()에서 반환된 항목으로 복사하므로 이러한 필드는 Derive()에서 업데이트할 필요가 없습니다.

>>> class MyGroup(ExceptionGroup):
...     def derive(self, exc):
...         return MyGroup(self.message, exc)
... 
>>> e = MyGroup("eg", [ValueError(1), TypeError(2)])
>>> e.add_note("a note")
>>> e.__context__ = Exception("context")
>>> e.__cause__ = Exception("cause")
>>> try:
...    raise e
... except Exception as e:
...    exc = e
... 
>>> match, rest = exc.split(ValueError)
>>> exc, exc.__context__, exc.__cause__, exc.__notes__
(MyGroup('eg', [ValueError(1), TypeError(2)]), Exception('context'), Exception('cause'), ['a note'])
>>> match, match.__context__, match.__cause__, match.__notes__
(MyGroup('eg', [ValueError(1)]), Exception('context'), Exception('cause'), ['a note'])
>>> rest, rest.__context__, rest.__cause__, rest.__notes__
(MyGroup('eg', [TypeError(2)]), Exception('context'), Exception('cause'), ['a note'])
>>> exc.__traceback__ is match.__traceback__ is rest.__traceback__
True

BaseExceptionGroup은 __new__()를 정의하므로 다른 생성자 시그니처가 필요한 서브클래스는 __init__() 대신 이를 재정의해야 합니다. 예를 들어 다음은 exit_code를 수락하고 여기에서 그룹의 메시지를 구성하는 예외 그룹 하위 클래스를 정의합니다.

class Errors(ExceptionGroup):
   def __new__(cls, errors, exit_code):
      self = super().__new__(Errors, f"exit code: {exit_code}", errors)
      self.exit_code = exit_code
      return self

   def derive(self, excs):
      return Errors(excs, self.exit_code)

ExceptionGroup과 마찬가지로 Exception의 하위 클래스이기도 한 BaseExceptionGroup의 모든 하위 클래스는 Exception의 인스턴스만 래핑할 수 있습니다.

버전 3.11의 새로운 기능.

Exception hierarchy

기본 제공 예외의 클래스 계층 구조는 다음과 같습니다.

BaseException
 ├── BaseExceptionGroup
 ├── GeneratorExit
 ├── KeyboardInterrupt
 ├── SystemExit
 └── Exception
      ├── ArithmeticError
      │    ├── FloatingPointError
      │    ├── OverflowError
      │    └── ZeroDivisionError
      ├── AssertionError
      ├── AttributeError
      ├── BufferError
      ├── EOFError
      ├── ExceptionGroup [BaseExceptionGroup]
      ├── ImportError
      │    └── ModuleNotFoundError
      ├── LookupError
      │    ├── IndexError
      │    └── KeyError
      ├── MemoryError
      ├── NameError
      │    └── UnboundLocalError
      ├── OSError
      │    ├── BlockingIOError
      │    ├── ChildProcessError
      │    ├── ConnectionError
      │    │    ├── BrokenPipeError
      │    │    ├── ConnectionAbortedError
      │    │    ├── ConnectionRefusedError
      │    │    └── ConnectionResetError
      │    ├── FileExistsError
      │    ├── FileNotFoundError
      │    ├── InterruptedError
      │    ├── IsADirectoryError
      │    ├── NotADirectoryError
      │    ├── PermissionError
      │    ├── ProcessLookupError
      │    └── TimeoutError
      ├── ReferenceError
      ├── RuntimeError
      │    ├── NotImplementedError
      │    └── RecursionError
      ├── StopAsyncIteration
      ├── StopIteration
      ├── SyntaxError
      │    └── IndentationError
      │         └── TabError
      ├── SystemError
      ├── TypeError
      ├── ValueError
      │    └── UnicodeError
      │         ├── UnicodeDecodeError
      │         ├── UnicodeEncodeError
      │         └── UnicodeTranslateError
      └── Warning
           ├── BytesWarning
           ├── DeprecationWarning
           ├── EncodingWarning
           ├── FutureWarning
           ├── ImportWarning
           ├── PendingDeprecationWarning
           ├── ResourceWarning
           ├── RuntimeWarning
           ├── SyntaxWarning
           ├── UnicodeWarning
           └── UserWarning

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

Python Built-in Types 2/2

Binary Sequence Types — bytesbytearraymemoryview

이진 데이터를 조작하기 위한 핵심 기본 제공 유형은 bytes 및 bytearray입니다. 그것들은 버퍼 프로토콜을 사용하여 사본을 만들 필요 없이 다른 이진 객체의 메모리에 액세스하는 memoryview에 의해 지원됩니다.

어레이 모듈은 32비트 정수 및 IEEE754 배정밀도 부동 값과 같은 기본 데이터 유형의 효율적인 저장을 지원합니다.

Bytes Objects

바이트 개체는 단일 바이트의 불변 시퀀스입니다. 많은 주요 이진 프로토콜이 ASCII 텍스트 인코딩을 기반으로 하기 때문에 바이트 객체는 ASCII 호환 데이터로 작업할 때만 유효하고 다양한 다른 방법으로 문자열 객체와 밀접하게 관련된 여러 메서드를 제공합니다.

class bytes([source[, encoding[, errors]]])

첫째, 바이트 리터럴의 구문은 b 접두사가 추가된다는 점을 제외하면 문자열 리터럴의 구문과 대체로 동일합니다.

  • 작은따옴표: b’여전히 “큰따옴표” 포함 허용’
  • 큰따옴표: b”여전히 ‘작은따옴표’ 포함 허용”
  • 3중 따옴표: b”’작은따옴표 3개”’, b”””큰따옴표 3개”””

바이트 리터럴에는 ASCII 문자만 허용됩니다(선언된 소스 코드 인코딩에 관계없이). 127을 초과하는 이진 값은 적절한 이스케이프 시퀀스를 사용하여 바이트 리터럴에 입력해야 합니다.

문자열 리터럴과 마찬가지로 바이트 리터럴도 r 접두사를 사용하여 이스케이프 시퀀스 처리를 비활성화할 수 있습니다. 지원되는 이스케이프 시퀀스를 포함하여 다양한 형태의 바이트 리터럴에 대한 자세한 내용은 문자열 및 바이트 리터럴을 참조하십시오.

바이트 리터럴과 표현은 ASCII 텍스트를 기반으로 하지만 바이트 객체는 실제로 변경할 수 없는 정수 시퀀스처럼 동작하며 시퀀스의 각 값은 0 <= x < 256으로 제한됩니다(이 제한을 위반하려는 시도는 ValueError를 트리거함). 이는 많은 이진 형식이 ASCII 기반 요소를 포함하고 일부 텍스트 지향 알고리즘으로 유용하게 조작될 수 있지만 일반적으로 임의의 이진 데이터에는 해당되지 않는다는 점을 강조하기 위해 의도적으로 수행됩니다. ASCII 호환은 일반적으로 데이터 손상으로 이어집니다).

리터럴 형식 외에도 여러 다른 방법으로 바이트 객체를 만들 수 있습니다.

  • 지정된 길이의 0으로 채워진 바이트열 객체: bytes(10)
  • 정수의 이터러블에서: bytes(range(20))
  • 버퍼 프로토콜을 통해 기존 바이너리 데이터 복사: bytes(obj)

내장 bytes도 참조하십시오.

2개의 16진수는 정확하게 단일 바이트에 해당하므로 16진수는 이진 데이터를 설명하는 데 일반적으로 사용되는 형식입니다. 따라서 바이트 유형에는 해당 형식의 데이터를 읽는 추가 클래스 메서드가 있습니다.

classmethod fromhex(string)

이 바이트 클래스 메서드는 주어진 문자열 객체를 디코딩하여 바이트 객체를 반환합니다. 문자열은 바이트당 두 개의 16진수를 포함해야 하며 ASCII 공백은 무시됩니다.

>>> bytes.fromhex('2Ef0 F1f2  ')
b'.\xf0\xf1\xf2'

버전 3.7에서 변경: bytes.fromhex()는 이제 공백뿐만 아니라 문자열의 모든 ASCII 공백을 건너뜁니다.

역변환 함수는 바이트열 객체를 16진수 표현으로 변환하기 위해 존재합니다.

hex([sep[, bytes_per_sep]])

인스턴스의 각 바이트에 대해 두 개의 16진수를 포함하는 문자열 객체를 반환합니다.

>>> b'\xf0\xf1\xf2'.hex()
'f0f1f2'

16진수 문자열을 읽기 쉽게 만들려면 출력에 포함할 단일 문자 구분자 sep 매개 변수를 지정할 수 있습니다. 기본적으로 이 구분 기호는 각 바이트 사이에 포함됩니다. 두 번째 선택적 bytes_per_sep 매개변수는 간격을 제어합니다. 양수 값은 오른쪽에서 구분자 위치를 계산하고 음수 값은 왼쪽에서 계산합니다.

>>> value = b'\xf0\xf1\xf2'
>>> value.hex('-')
'f0-f1-f2'
>>> value.hex('_', 2)
'f0_f1f2'
>>> b'UUDDLRLRAB'.hex(' ', -4)
'55554444 4c524c52 4142

버전 3.5의 새로운 기능.

버전 3.8에서 변경: bytes.hex()는 이제 선택적 sep 및 bytes_per_sep 매개 변수를 지원하여 16진수 출력에서 바이트 사이에 구분 기호를 삽입합니다.

바이트열 객체는 정수 시퀀스(튜플과 유사)이므로 바이트열 객체 b의 경우 b[0]은 정수이고 b[0:1]은 길이가 1인 바이트열 객체입니다. (텍스트와 대조됩니다. 인덱싱과 슬라이싱 모두 길이가 1인 문자열을 생성하는 문자열

바이트 객체의 표현은 리터럴 형식(b’…’)을 사용합니다. 바이트([46, 46, 46]). 항상 list(b)를 사용하여 바이트 객체를 정수 목록으로 변환할 수 있습니다.

Bytearray Objects

bytearray 객체는 바이트열 객체에 대한 변경 가능한 대응물입니다.

class bytearray([source[, encoding[, errors]]])

bytearray 객체에 대한 전용 리터럴 구문은 없으며 대신 항상 생성자를 호출하여 생성됩니다.

  • 빈 인스턴스 만들기: bytearray()
  • 주어진 길이로 0으로 채워진 인스턴스 만들기: bytearray(10)
  • 정수의 이터러블에서: bytearray(range(20))
  • 버퍼 프로토콜을 통해 기존 바이너리 데이터 복사: bytearray(b’Hi!’)

바이트 배열 객체는 변경 가능하므로 바이트 및 바이트 배열 작업에 설명된 일반 바이트 및 바이트 배열 작업 외에도 변경 가능한 시퀀스 작업을 지원합니다.

bytearray 내장함수도 참조하십시오.

2개의 16진수는 정확하게 단일 바이트에 해당하므로 16진수는 이진 데이터를 설명하는 데 일반적으로 사용되는 형식입니다. 따라서 bytearray 유형에는 해당 형식의 데이터를 읽는 추가 클래스 메서드가 있습니다.

classmethod fromhex(string)

이 bytearray 클래스 메서드는 주어진 문자열 객체를 디코딩하여 bytearray 객체를 반환합니다. 문자열은 바이트당 두 개의 16진수를 포함해야 하며 ASCII 공백은 무시됩니다.

>>> bytearray.fromhex('2Ef0 F1f2  ')
bytearray(b'.\xf0\xf1\xf2')

버전 3.7에서 변경: bytearray.fromhex()는 이제 문자열에서 공백뿐만 아니라 모든 ASCII 공백을 건너뜁니다.

역변환 함수는 bytearray 객체를 16진수 표현으로 변환하기 위해 존재합니다.

hex([sep[, bytes_per_sep]])

인스턴스의 각 바이트에 대해 두 개의 16진수를 포함하는 문자열 객체를 반환합니다.

>>> bytearray(b'\xf0\xf1\xf2').hex()
'f0f1f2'

버전 3.5의 새로운 기능.

버전 3.8에서 변경: bytes.hex()와 유사하게, bytearray.hex()는 이제 선택적 sep 및 bytes_per_sep 매개변수를 지원하여 16진수 출력에서 바이트 사이에 구분 기호를 삽입합니다.

바이트 배열 객체는 정수 시퀀스(목록과 유사)이므로 바이트 배열 객체 b의 경우 b[0]은 정수이고 b[0:1]은 길이가 1인 바이트 배열 객체입니다. (이는 텍스트와 대조됩니다. 인덱싱과 슬라이싱 모두 길이가 1인 문자열을 생성하는 문자열

bytearray 객체의 표현은 바이트열 리터럴 형식(bytearray(b’…’))을 사용합니다. bytearray([46, 46, 46]). 항상 list(b)를 사용하여 bytearray 객체를 정수 목록으로 변환할 수 있습니다.

Bytes and Bytearray Operations

bytes 및 bytearray 객체 모두 공통 시퀀스 연산을 지원합니다. 이들은 동일한 유형의 피연산자뿐만 아니라 모든 바이트열류 객체와도 상호 운용됩니다. 이러한 유연성으로 인해 오류 없이 작업에서 자유롭게 혼합할 수 있습니다. 그러나 결과의 반환 유형은 피연산자의 순서에 따라 달라질 수 있습니다.

참고: 문자열에 대한 메서드가 바이트를 인수로 허용하지 않는 것처럼 바이트열 및 바이트 배열 객체에 대한 메서드는 문자열을 인수로 허용하지 않습니다. 예를 들어 다음과 같이 작성해야 합니다.

a = “abc”
b = a.replace(“a”, “f”)

그리고

a = b”abc”
b = a.replace(b”a”, b”f”)

일부 바이트 및 바이트 배열 작업은 ASCII 호환 이진 형식을 사용한다고 가정하므로 임의의 이진 데이터로 작업할 때는 피해야 합니다. 이러한 제한 사항은 아래에서 다룹니다.

참고: 이러한 ASCII 기반 작업을 사용하여 ASCII 기반 형식으로 저장되지 않은 이진 데이터를 조작하면 데이터가 손상될 수 있습니다.

바이트 및 바이트 배열 개체에 대한 다음 메서드는 임의의 이진 데이터와 함께 사용할 수 있습니다.

bytes.count(sub[, start[, end]])
bytearray.count(sub[, start[, end]])

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

검색할 하위 시퀀스는 바이트열류 객체 또는 0에서 255 범위의 정수일 수 있습니다.

sub가 비어 있으면 바이트 객체의 길이에 1을 더한 문자 사이의 빈 슬라이스 수를 반환합니다.

버전 3.3에서 변경: 또한 하위 시퀀스로 0에서 255 범위의 정수를 허용합니다.

bytes.removeprefix(prefix, /)
bytearray.removeprefix(prefix, /)

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

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

접두사는 bytes-like object 객체일 수 있습니다.

참고: 이 메서드의 bytearray 버전은 제자리에서 작동하지 않습니다. 변경 사항이 없더라도 항상 새 개체를 생성합니다.

버전 3.9의 새로운 기능.

bytes.removesuffix(suffix, /)
bytearray.removesuffix(suffix, /)

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

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

접미사는 바이트열류 객체일 수 있습니다.

참고: 이 메서드의 bytearray 버전은 제자리에서 작동하지 않습니다. 변경 사항이 없더라도 항상 새 개체를 생성합니다.

버전 3.9의 새로운 기능.

bytes.decode(encoding=’utf-8′, errors=’strict’)
bytearray.decode(encoding=’utf-8′, errors=’strict’)

str로 디코딩된 바이트를 반환합니다.

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

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

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

참고: 인코딩 인수를 str에 전달하면 임시 bytes 또는 bytearray 객체를 만들 필요 없이 모든 바이트열류 객체를 직접 디코딩할 수 있습니다.

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

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

bytes.endswith(suffix[, start[, end]])
bytearray.endswith(suffix[, start[, end]])

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

검색할 접미사는 바이트열류 객체일 수 있습니다.

bytes.find(sub[, start[, end]])
bytearray.find(sub[, start[, end]])

sub가 슬라이스 s[start:end]에 포함되도록 하위 시퀀스 sub가 있는 데이터에서 가장 낮은 인덱스를 반환합니다. 선택적 인수 start 및 end는 슬라이스 표기법으로 해석됩니다. sub를 찾을 수 없으면 -1을 반환합니다.

검색할 하위 시퀀스는 바이트열류 객체 또는 0에서 255 범위의 정수일 수 있습니다.

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

>>> b’Py’ in b’Python’
True

버전 3.3에서 변경: 또한 하위 시퀀스로 0에서 255 범위의 정수를 허용합니다.

bytes.index(sub[, start[, end]])
bytearray.index(sub[, start[, end]])

find()와 비슷하지만 하위 시퀀스를 찾을 수 없으면 ValueError가 발생합니다.

검색할 하위 시퀀스는 바이트열류 객체 또는 0에서 255 범위의 정수일 수 있습니다.

버전 3.3에서 변경: 또한 하위 시퀀스로 0에서 255 범위의 정수를 허용합니다.

bytes.join(iterable)
bytearray.join(iterable)

iterable에서 이진 데이터 시퀀스를 연결한 바이트 또는 바이트 배열 객체를 반환합니다. str 객체를 포함하여 바이트열류 객체가 아닌 값이 iterable에 있으면 TypeError가 발생합니다. 요소 사이의 구분 기호는 이 메서드를 제공하는 바이트 또는 바이트 배열 객체의 내용입니다.

static bytes.maketrans(from, to)
static bytearray.maketrans(from, to)

이 정적 메서드는 각 문자를 같은 위치에 있는 문자로 매핑하는 bytes.translate()에 사용할 수 있는 변환 테이블을 반환합니다. from과 to는 모두 바이트열류 객체여야 하며 길이가 같아야 합니다.

버전 3.1의 새로운 기능.

bytes.partition(sep)
bytearray.partition(sep)

sep가 처음 나타날 때 시퀀스를 분할하고 구분자 앞의 부분, 구분자 자체 또는 bytearray 복사본, 구분자 뒤의 부분을 포함하는 3-튜플을 반환합니다. 구분 기호를 찾을 수 없으면 원래 시퀀스의 복사본을 포함하는 3-튜플을 반환하고 그 뒤에 두 개의 빈 바이트 또는 바이트 배열 객체를 반환합니다.

검색할 구분 기호는 bytes-like object 객체일 수 있습니다.

bytes.replace(old, new[, count])
bytearray.replace(old, new[, count])

new로 대체된 하위 시퀀스 old의 모든 항목이 포함된 시퀀스의 복사본을 반환합니다. 선택적 인수 count가 제공되면 첫 번째 count 항목만 대체됩니다.

검색할 하위 시퀀스 및 대체 항목은 모든 바이트열류 객체일 수 있습니다.

참고: 이 메서드의 bytearray 버전은 제자리에서 작동하지 않습니다. 변경 사항이 없더라도 항상 새 개체를 생성합니다.

bytes.rfind(sub[, start[, end]])
bytearray.rfind(sub[, start[, end]]

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

검색할 하위 시퀀스는 바이트열류 객체 또는 0에서 255 범위의 정수일 수 있습니다.

버전 3.3에서 변경: 또한 하위 시퀀스로 0에서 255 범위의 정수를 허용합니다.

bytes.rindex(sub[, start[, end]])
bytearray.rindex(sub[, start[, end]])

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

검색할 하위 시퀀스는 바이트열류 객체 또는 0에서 255 범위의 정수일 수 있습니다.

버전 3.3에서 변경: 또한 하위 시퀀스로 0에서 255 범위의 정수를 허용합니다.

bytes.rpartition(sep)
bytearray.rpartition(sep)

sep의 마지막 발생에서 시퀀스를 분할하고 구분 기호 앞의 부분, 구분 기호 자체 또는 해당 바이트 배열 복사본 및 구분 기호 뒤의 부분을 포함하는 3-튜플을 반환합니다. 구분 기호를 찾을 수 없으면 두 개의 빈 바이트 또는 바이트 배열 객체와 원래 시퀀스의 복사본을 포함하는 3-튜플을 반환합니다.

검색할 구분 기호는 바이트열류 객체일 수 있습니다.

bytes.startswith(prefix[, start[, end]])
bytearray.startswith(prefix[, start[, end]])

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

검색할 접두사는 바이트열류 객체일 수 있습니다.

bytes.translate(table, /, delete=b”)
bytearray.translate(table, /, delete=b”)

선택적 인수 delete에서 발생하는 모든 바이트가 제거되고 나머지 바이트는 길이 256의 바이트 객체여야 하는 지정된 변환 테이블을 통해 매핑된 바이트 또는 바이트 배열 객체의 복사본을 반환합니다.

bytes.maketrans() 메서드를 사용하여 변환 테이블을 만들 수 있습니다.

문자만 삭제하는 번역의 경우 테이블 인수를 None으로 설정합니다.

>>> b'read this short text'.translate(None, b'aeiou')
b'rd ths shrt txt'

버전 3.6에서 변경: 이제 delete가 키워드 인수로 지원됩니다.

바이트 및 바이트 배열 객체에 대한 다음 메서드에는 ASCII 호환 이진 형식의 사용을 가정하는 기본 동작이 있지만 적절한 인수를 전달하여 임의의 이진 데이터와 함께 계속 사용할 수 있습니다. 이 섹션의 모든 bytearray 메서드는 제자리에서 작동하지 않고 대신 새 개체를 생성합니다.

bytes.center(width[, fillbyte])
bytearray.center(width[, fillbyte])

길이 너비 시퀀스의 중심에 있는 객체의 복사본을 반환합니다. 패딩은 지정된 필바이트를 사용하여 수행됩니다(기본값은 ASCII 공간임). 바이트 객체의 경우 너비가 len(s)보다 작거나 같으면 원래 시퀀스가 반환됩니다.

참고: 이 메서드의 bytearray 버전은 제자리에서 작동하지 않습니다. 변경 사항이 없더라도 항상 새 개체를 생성합니다.

bytes.ljust(width[, fillbyte])
bytearray.ljust(width[, fillbyte])

길이 너비 시퀀스에서 왼쪽 정렬된 객체의 복사본을 반환합니다. 패딩은 지정된 필바이트를 사용하여 수행됩니다(기본값은 ASCII 공간임). 바이트 객체의 경우 너비가 len(s)보다 작거나 같으면 원래 시퀀스가 반환됩니다.

참고 이 메서드의 bytearray 버전은 제자리에서 작동하지 않습니다. 변경 사항이 없더라도 항상 새 개체를 생성합니다.

bytes.lstrip([chars])
bytearray.lstrip([chars])

지정된 선행 바이트가 제거된 시퀀스의 복사본을 반환합니다. chars 인수는 제거할 바이트 값 집합을 지정하는 이진 시퀀스입니다. 이름은 이 메서드가 일반적으로 ASCII 문자와 함께 사용된다는 사실을 나타냅니다. 생략하거나 None인 경우 chars 인수는 기본적으로 ASCII 공백을 제거합니다. chars 인수는 접두사가 아닙니다. 오히려 해당 값의 모든 조합이 제거됩니다.

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

제거할 바이트 값의 이진 시퀀스는 임의의 바이트열류 객체일 수 있습니다. 모든 문자 집합이 아닌 단일 접두사 문자열을 제거하는 방법은 removeprefix()를 참조하십시오. 예를 들어:

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

참고 이 메서드의 bytearray 버전은 제자리에서 작동하지 않습니다. 변경 사항이 없더라도 항상 새 개체를 생성합니다.

bytes.rjust(width[, fillbyte])
bytearray.rjust(width[, fillbyte])

길이 너비 시퀀스에서 오른쪽 정렬된 객체의 복사본을 반환합니다. 패딩은 지정된 필바이트를 사용하여 수행됩니다(기본값은 ASCII 공간임). 바이트 객체의 경우 너비가 len(s)보다 작거나 같으면 원래 시퀀스가 반환됩니다.

참고 이 메서드의 bytearray 버전은 제자리에서 작동하지 않습니다. 변경 사항이 없더라도 항상 새 개체를 생성합니다.

bytes.rsplit(sep=None, maxsplit=- 1)
bytearray.rsplit(sep=None, maxsplit=- 1)

sep를 구분 기호 문자열로 사용하여 이진 시퀀스를 동일한 유형의 하위 시퀀스로 분할합니다. maxsplit이 주어지면 최대 maxsplit 분할이 수행됩니다. sep가 지정되지 않았거나 None인 경우 ASCII 공백만으로 구성된 하위 시퀀스는 구분 기호입니다. 오른쪽에서 분할하는 것을 제외하고 rsplit()은 아래에서 자세히 설명하는 split()과 같이 동작합니다.

bytes.rstrip([chars])
bytearray.rstrip([chars])

지정된 후행 바이트가 제거된 시퀀스의 복사본을 반환합니다. chars 인수는 제거할 바이트 값 집합을 지정하는 이진 시퀀스입니다. 이름은 이 메서드가 일반적으로 ASCII 문자와 함께 사용된다는 사실을 나타냅니다. 생략하거나 None인 경우 chars 인수는 기본적으로 ASCII 공백을 제거합니다. chars 인수는 접미사가 아닙니다. 오히려 해당 값의 모든 조합이 제거됩니다.

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

제거할 바이트 값의 이진 시퀀스는 임의의 바이트열류 객체일 수 있습니다. 모든 문자 집합이 아닌 단일 접미사 문자열을 제거하는 메서드는 removesuffix()를 참조하십시오. 예를 들어:

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

참고 이 메서드의 bytearray 버전은 제자리에서 작동하지 않습니다. 변경 사항이 없더라도 항상 새 개체를 생성합니다.

bytes.split(sep=None, maxsplit=- 1)
bytearray.split(sep=None, maxsplit=- 1)

sep를 구분 기호 문자열로 사용하여 이진 시퀀스를 동일한 유형의 하위 시퀀스로 분할합니다. maxsplit이 제공되고 음수가 아닌 경우 최대 maxsplit 분할이 수행됩니다(따라서 목록에는 최대 maxsplit+1 요소가 있음). maxsplit이 지정되지 않았거나 -1이면 분할 수에 제한이 없습니다(가능한 모든 분할이 이루어짐).

sep가 제공되면 연속 구분 기호는 함께 그룹화되지 않고 빈 하위 시퀀스를 구분하는 것으로 간주됩니다(예: b’1,,2′.split(b’,’)는 [b’1′, b”, b’를 반환함) 2′]). sep 인수는 멀티바이트 시퀀스로 구성될 수 있습니다(예: b’1<>2<>3′.split(b'<>’)는 [b’1′, b’2′, b’3′]를 반환함) . 빈 시퀀스를 지정된 구분 기호로 분할하면 분할되는 개체 유형에 따라 [b”] 또는 [bytearray(b”)]가 반환됩니다. sep 인수는 바이트열류 객체일 수 있습니다.

예를 들어:

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

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

예를 들어:

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

bytes.strip([chars])
bytearray.strip([chars])

지정된 선행 및 후행 바이트가 제거된 시퀀스의 복사본을 반환합니다. chars 인수는 제거할 바이트 값 집합을 지정하는 이진 시퀀스입니다. 이름은 이 메서드가 일반적으로 ASCII 문자와 함께 사용된다는 사실을 나타냅니다. 생략하거나 None인 경우 chars 인수는 기본적으로 ASCII 공백을 제거합니다. chars 인수는 접두사 또는 접미사가 아닙니다. 오히려 해당 값의 모든 조합이 제거됩니다.

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

제거할 바이트 값의 이진 시퀀스는 임의의 바이트열류 객체일 수 있습니다.

참고 이 메서드의 bytearray 버전은 제자리에서 작동하지 않습니다. 변경 사항이 없더라도 항상 새 개체를 생성합니다.

바이트 및 바이트 배열 개체에 대한 다음 메서드는 ASCII 호환 이진 형식을 사용한다고 가정하며 임의의 이진 데이터에 적용하면 안 됩니다. 이 섹션의 모든 bytearray 메서드는 제자리에서 작동하지 않고 대신 새 개체를 생성합니다.

bytes.capitalize()
bytearray.capitalize()

각 바이트가 ASCII 문자로 해석되고 첫 번째 바이트는 대문자이고 나머지는 소문자로 된 시퀀스의 복사본을 반환합니다. ASCII가 아닌 바이트 값은 변경되지 않은 상태로 전달됩니다.

참고 이 메서드의 bytearray 버전은 제자리에서 작동하지 않습니다. 변경 사항이 없더라도 항상 새 개체를 생성합니다.

bytes.expandtabs(tabsize=8)
bytearray.expandtabs(tabsize=8)

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

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

참고 이 메서드의 bytearray 버전은 제자리에서 작동하지 않습니다. 변경 사항이 없더라도 항상 새 개체를 생성합니다.

bytes.isalnum()
bytearray.isalnum()

시퀀스의 모든 바이트가 알파벳 ASCII 문자 또는 ASCII 십진수이고 시퀀스가 비어 있지 않으면 True를 반환하고, 그렇지 않으면 False를 반환합니다. 알파벳 ASCII 문자는 시퀀스 b’abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’의 바이트 값입니다. ASCII 십진수는 시퀀스 b’0123456789’의 바이트 값입니다.

예를 들어:

>>> b'ABCabc1'.isalnum()
True
>>> b'ABC abc1'.isalnum()
False

bytes.isalpha()
bytearray.isalpha()

시퀀스의 모든 바이트가 알파벳 ASCII 문자이고 시퀀스가 비어 있지 않으면 True를 반환하고, 그렇지 않으면 False를 반환합니다. 알파벳 ASCII 문자는 시퀀스 b’abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’의 바이트 값입니다.

예를 들어:

>>> b'ABCabc'.isalpha()
True
>>> b'ABCabc1'.isalpha()
False

bytes.isascii()
bytearray.isascii()

시퀀스가 비어 있거나 시퀀스의 모든 바이트가 ASCII이면 True를 반환하고 그렇지 않으면 False를 반환합니다. ASCII 바이트는 0-0x7F 범위에 있습니다.

버전 3.7의 새로운 기능.

bytes.isdigit()
bytearray.isdigit()

시퀀스의 모든 바이트가 ASCII 십진수이고 시퀀스가 비어 있지 않으면 True를 반환하고 그렇지 않으면 False를 반환합니다. ASCII 십진수는 시퀀스 b’0123456789’의 바이트 값입니다.

예를 들어:

>>> b'1234'.isdigit()
True
>>> b'1.23'.isdigit()
False

bytes.islower()
bytearray.islower()

시퀀스에 소문자 ASCII 문자가 하나 이상 있고 대문자 ASCII 문자가 없으면 True를 반환하고 그렇지 않으면 False를 반환합니다.

예를 들어:

>>> b'hello world'.islower()
True
>>> b'Hello world'.islower()
False

소문자 ASCII 문자는 시퀀스 b’abcdefghijklmnopqrstuvwxyz’의 바이트 값입니다. 대문자 ASCII 문자는 시퀀스 b’ABCDEFGHIJKLMNOPQRSTUVWXYZ’의 바이트 값입니다.

bytes.isspace()
bytearray.isspace()

시퀀스의 모든 바이트가 ASCII 공백이고 시퀀스가 비어 있지 않으면 True를 반환하고 그렇지 않으면 False를 반환합니다. ASCII 공백 문자는 시퀀스 b’ \t\n\r\x0b\f'(공백, 탭, 줄 바꿈, 캐리지 리턴, 세로 탭, 양식 공급)의 바이트 값입니다.

bytes.istitle()
bytearray.istitle()

시퀀스가 ASCII 제목 케이스이고 시퀀스가 비어 있지 않으면 True를 반환하고, 그렇지 않으면 False를 반환합니다. “titlecase”의 정의에 대한 자세한 내용은 bytes.title()을 참조하세요.

예를 들어:

>>> b'Hello World'.istitle()
True
>>> b'Hello world'.istitle()
False

bytes.isupper()
bytearray.isupper()

시퀀스에 대문자 알파벳 ASCII 문자가 하나 이상 있고 소문자 ASCII 문자가 없으면 True를 반환하고, 그렇지 않으면 False를 반환합니다.

예를 들어:

>>> b'HELLO WORLD'.isupper()
True
>>> b'Hello world'.isupper()
False

소문자 ASCII 문자는 시퀀스 b’abcdefghijklmnopqrstuvwxyz’의 바이트 값입니다. 대문자 ASCII 문자는 시퀀스 b’ABCDEFGHIJKLMNOPQRSTUVWXYZ’의 바이트 값입니다.

bytes.lower()
bytearray.lower()

모든 대문자 ASCII 문자가 해당 소문자로 변환된 시퀀스의 복사본을 반환합니다.

예를 들어:

>>> b'Hello World'.lower()
b'hello world'

소문자 ASCII 문자는 시퀀스 b’abcdefghijklmnopqrstuvwxyz’의 바이트 값입니다. 대문자 ASCII 문자는 시퀀스 b’ABCDEFGHIJKLMNOPQRSTUVWXYZ’의 바이트 값입니다.

참고: 이 메서드의 bytearray 버전은 제자리에서 작동하지 않습니다. 변경 사항이 없더라도 항상 새 개체를 생성합니다.

bytes.splitlines(keepends=False)
bytearray.splitlines(keepends=False)

ASCII 줄 경계에서 끊어지는 이진 시퀀스의 줄 목록을 반환합니다. 이 방법은 줄을 분할하기 위해 범용 개행 접근 방식을 사용합니다. keepends가 제공되고 true가 아니면 결과 목록에 줄바꿈이 포함되지 않습니다.

예를 들어:

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

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

>>> b"".split(b'\n'), b"Two lines\n".split(b'\n')
([b''], [b'Two lines', b''])
>>> b"".splitlines(), b"One line\n".splitlines()
([], [b'One line'])

bytes.swapcase()
bytearray.swapcase()

모든 소문자 ASCII 문자가 해당 대문자로 변환되거나 그 반대로 변환된 시퀀스의 복사본을 반환합니다.

예를 들어:

>>> b'Hello World'.swapcase()
b'hELLO wORLD'

소문자 ASCII 문자는 시퀀스 b’abcdefghijklmnopqrstuvwxyz’의 바이트 값입니다. 대문자 ASCII 문자는 시퀀스 b’ABCDEFGHIJKLMNOPQRSTUVWXYZ’의 바이트 값입니다.

str.swapcase()와 달리 바이너리 버전의 경우 항상 bin.swapcase().swapcase() == bin인 경우입니다. 대소문자 변환은 임의의 유니코드 코드 포인트에 대해 일반적으로 사실이 아니지만 ASCII에서 대칭적입니다.

참고: 이 메서드의 bytearray 버전은 제자리에서 작동하지 않습니다. 변경 사항이 없더라도 항상 새 개체를 생성합니다.

bytes.title()
bytearray.title()

단어가 대문자 ASCII 문자로 시작하고 나머지 문자는 소문자인 바이너리 시퀀스의 제목이 있는 버전을 반환합니다. 케이스가 없는 바이트 값은 수정되지 않은 상태로 남습니다.

예를 들어:

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

소문자 ASCII 문자는 시퀀스 b’abcdefghijklmnopqrstuvwxyz’의 바이트 값입니다. 대문자 ASCII 문자는 시퀀스 b’ABCDEFGHIJKLMNOPQRSTUVWXYZ’의 바이트 값입니다. 다른 모든 바이트 값은 대/소문자가 구분되지 않습니다.

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

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

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

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

참고: 이 메서드의 bytearray 버전은 제자리에서 작동하지 않습니다. 변경 사항이 없더라도 항상 새 개체를 생성합니다.

bytes.upper()
bytearray.upper()

모든 소문자 ASCII 문자가 해당 대문자로 변환된 시퀀스의 복사본을 반환합니다.

예를 들어:

>>> b'Hello World'.upper()
b'HELLO WORLD

소문자 ASCII 문자는 시퀀스 b’abcdefghijklmnopqrstuvwxyz’의 바이트 값입니다. 대문자 ASCII 문자는 시퀀스 b’ABCDEFGHIJKLMNOPQRSTUVWXYZ’의 바이트 값입니다.

참고: 이 메서드의 bytearray 버전은 제자리에서 작동하지 않습니다. 변경 사항이 없더라도 항상 새 개체를 생성합니다.

bytes.zfill(width)
bytearray.zfill(width)

길이 너비의 시퀀스를 만들기 위해 ASCII b’0′ 숫자로 채워진 시퀀스의 복사본을 반환합니다. 앞 기호 접두사(b’+’/ b’-‘)는 앞이 아닌 기호 문자 뒤에 패딩을 삽입하여 처리됩니다. 바이트 객체의 경우 너비가 len(seq)보다 작거나 같으면 원래 시퀀스가 반환됩니다.

예를 들어:

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

참고: 이 메서드의 bytearray 버전은 제자리에서 작동하지 않습니다. 변경 사항이 없더라도 항상 새 개체를 생성합니다.

printf-style Bytes Formatting

참고: 여기에 설명된 서식 지정 작업은 여러 일반적인 오류(예: 튜플 및 사전을 올바르게 표시하지 못함)로 이어지는 다양한 문제를 나타냅니다. 출력되는 값이 튜플이나 딕셔너리일 수 있으면 튜플로 감싸십시오.

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

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

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

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

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

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

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

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

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

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

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

ConversionMeaning
'd'부호 있는 정수 십진수.
'i'부호 있는 정수 십진수.
'o'부호 있는 8진수 값.
'u'폐기된 유형 – ‘d’와 동일합니다.
'x'부호 있는 16진수(소문자).
'X'부호 있는 16진수(소문자).
'e'부동 소수점 지수 형식(소문자).
'E'부동 소수점 지수 형식(대문자).
'f'부동 소수점 10진수 형식.
'F'부동 소수점 10진수 형식.
'g'부동 소수점 형식. 지수가 -4보다 작거나 정밀도보다 작지 않으면 소문자 지수 형식을 사용하고 그렇지 않으면 십진수 형식을 사용합니다.
'G'부동 소수점 형식. 지수가 -4보다 작거나 정밀도보다 작지 않으면 대문자 지수 형식을 사용하고 그렇지 않으면 십진수 형식을 사용합니다.
'c'1바이트(정수 또는 1바이트 객체 허용).
'b'바이트(버퍼 프로토콜을 따르거나 __bytes__()를 갖는 모든 객체).
's'‘s’는 ‘b’의 별칭이며 Python2/3 코드 베이스에만 사용해야 합니다.
'a'바이트(repr(obj).encode(‘ascii’, ‘backslashreplace’)를 사용하여 Python 객체를 변환함).
'r'‘r’은 ‘a’의 별칭이며 Python2/3 코드 베이스에만 사용해야 합니다.
'%'인수가 변환되지 않고 결과에 ‘%’ 문자가 표시됩니다.

노트:

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

참고: 이 메서드의 bytearray 버전은 제자리에서 작동하지 않습니다. 변경 사항이 없더라도 항상 새 개체를 생성합니다.
PEP 461 – 바이트 및 바이트 배열에 % 형식 지정 추가 참조

버전 3.5의 새로운 기능.

Memory Views

memoryview 개체를 사용하면 Python 코드가 복사하지 않고 버퍼 프로토콜을 지원하는 개체의 내부 데이터에 액세스할 수 있습니다.

class memoryview(object)

개체를 참조하는 memoryview를 만듭니다. 개체는 버퍼 프로토콜을 지원해야 합니다. 버퍼 프로토콜을 지원하는 내장 개체에는 bytes 및 bytearray가 포함됩니다.

memoryview에는 원래 개체에서 처리하는 원자 메모리 단위인 요소라는 개념이 있습니다. bytes 및 bytearray와 같은 많은 단순 유형의 경우 요소는 단일 바이트이지만 array.array와 같은 다른 유형에는 더 큰 요소가 있을 수 있습니다.

len(view)는 tolist의 길이와 같습니다. view.ndim = 0이면 길이는 1입니다. view.ndim = 1이면 길이는 보기의 요소 수와 같습니다. 더 높은 차원의 경우 길이는 보기의 중첩 목록 표시 길이와 같습니다. itemsize 속성은 단일 요소의 바이트 수를 제공합니다.

memoryview는 데이터를 노출하기 위해 슬라이싱 및 인덱싱을 지원합니다. 1차원 슬라이싱은 하위 뷰를 생성합니다.

>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
<memory at 0x7f3ddc9f4350>
>>> bytes(v[1:4])
b'bce'

format이 struct 모듈의 기본 형식 지정자 중 하나인 경우 정수 또는 정수 튜플을 사용한 인덱싱도 지원되며 올바른 유형의 단일 요소를 반환합니다. 1차원 메모리 뷰는 정수 또는 1정수 튜플로 인덱싱할 수 있습니다. 다차원 메모리 뷰는 정확히 ndim 정수의 튜플로 인덱싱할 수 있습니다. 여기서 ndim은 차원 수입니다. 0차원 메모리 뷰는 빈 튜플로 인덱싱할 수 있습니다.

다음은 바이트가 아닌 형식의 예입니다.

>>> import array
>>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444])
>>> m = memoryview(a)
>>> m[0]
-11111111
>>> m[-1]
44444444
>>> m[::2].tolist()
[-11111111, -33333333]

기본 객체가 쓰기 가능한 경우 memoryview는 1차원 슬라이스 할당을 지원합니다. 크기 조정이 허용되지 않습니다:

>>> data = bytearray(b'abcefg')
>>> v = memoryview(data)
>>> v.readonly
False
>>> v[0] = ord(b'z')
>>> data
bytearray(b'zbcefg')
>>> v[1:4] = b'123'
>>> data
bytearray(b'z123fg')
>>> v[2:3] = b'spam'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: memoryview assignment: lvalue and rvalue have different structures
>>> v[2:6] = b'spam'
>>> data
bytearray(b'z1spam')

형식이 ‘B’, ‘b’ 또는 ‘c’인 해시 가능(읽기 전용) 유형의 1차원 메모리 뷰도 해시 가능합니다. 해시는 hash(m) == hash(m.tobytes())로 정의됩니다.

>>> v = memoryview(b'abcefg')
>>> hash(v) == hash(b'abcefg')
True
>>> hash(v[2:4]) == hash(b'ce')
True
>>> hash(v[::-2]) == hash(b'abcefg'[::-2])
True

버전 3.3에서 변경: 이제 1차원 메모리 뷰를 슬라이스할 수 있습니다. ‘B’, ‘b’ 또는 ‘c’ 형식의 1차원 메모리 뷰는 이제 해시 가능합니다.

버전 3.4에서 변경: 이제 memoryview가 collections.abc.Sequence에 자동으로 등록됩니다.

버전 3.5에서 변경: memoryviews는 이제 정수 튜플로 인덱싱할 수 있습니다.

memoryview에는 여러 가지 방법이 있습니다.

__eq__(exporter)

memoryview와 PEP 3118 내보내기는 모양이 동일하고 피연산자의 각 형식 코드가 struct 구문을 사용하여 해석될 때 해당하는 모든 값이 동일하면 동일합니다.

현재 tolist()에서 지원하는 구조체 형식 문자열의 하위 집합의 경우 v.tolist() == w.tolist()인 경우 v와 w는 동일합니다.

>>> import array
>>> a = array.array('I', [1, 2, 3, 4, 5])
>>> b = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0])
>>> c = array.array('b', [5, 3, 1])
>>> x = memoryview(a)
>>> y = memoryview(b)
>>> x == a == y == b
True
>>> x.tolist() == a.tolist() == y.tolist() == b.tolist()
True
>>> z = y[::-2]
>>> z == c
True
>>> z.tolist() == c.tolist()
True

형식 문자열 중 하나가 struct 모듈에서 지원되지 않으면 개체는 항상 같지 않은 것으로 비교됩니다(형식 문자열과 버퍼 내용이 동일하더라도).

>>> from ctypes import BigEndianStructure, c_long
>>> class BEPoint(BigEndianStructure):
...     _fields_ = [("x", c_long), ("y", c_long)]
...
>>> point = BEPoint(100, 200)
>>> a = memoryview(point)
>>> b = memoryview(point)
>>> a == point
False
>>> a == b
False

부동 소수점 숫자와 마찬가지로 v is w는 memoryview 개체에 대해 v == w를 의미하지 않습니다.

버전 3.3에서 변경: 이전 버전에서는 항목 형식과 논리 배열 구조를 무시하고 원시 메모리를 비교했습니다.

tobytes(order=’C’)

버퍼의 데이터를 바이트열로 반환합니다. 이는 memoryview에서 바이트 생성자를 호출하는 것과 같습니다.

>>> m = memoryview(b"abc")
>>> m.tobytes()
b'abc'
>>> bytes(m)
b'abc'

비연속 배열의 경우 결과는 모든 요소가 바이트로 변환된 평면화된 목록 표현과 동일합니다. tobytes()는 struct 모듈 구문에 없는 것을 포함하여 모든 형식 문자열을 지원합니다.

버전 3.8의 새로운 기능: 주문은 {‘C’, ‘F’, ‘A’}가 될 수 있습니다. 순서가 ‘C’ 또는 ‘F’인 경우 원래 배열의 데이터가 C 또는 Fortran 순서로 변환됩니다. 연속 보기의 경우 ‘A’는 실제 메모리의 정확한 복사본을 반환합니다. 특히 메모리 내 Fortran 순서가 보존됩니다. 비연속 보기의 경우 데이터가 먼저 C로 변환됩니다. order=None은 order=’C’와 동일합니다.

hex([sep[, bytes_per_sep]])

버퍼의 각 바이트에 대해 두 개의 16진수를 포함하는 문자열 객체를 반환합니다.

>>> m = memoryview(b"abc")
>>> m.hex()
'616263'

버전 3.5의 새로운 기능.

버전 3.8에서 변경: bytes.hex()와 유사하게 memoryview.hex()는 이제 16진수 출력에서 바이트 사이에 구분 기호를 삽입하기 위해 선택적 sep 및 bytes_per_sep 매개 변수를 지원합니다.

tolist()

버퍼의 데이터를 요소 목록으로 반환합니다.

>>> memoryview(b'abc').tolist()
[97, 98, 99]
>>> import array
>>> a = array.array('d', [1.1, 2.2, 3.3])
>>> m = memoryview(a)
>>> m.tolist()
[1.1, 2.2, 3.3]

버전 3.3에서 변경: tolist()는 이제 다차원 표현뿐만 아니라 구조체 모듈 구문의 모든 단일 문자 기본 형식을 지원합니다.

toreadonly()

memoryview 객체의 읽기 전용 버전을 반환합니다. 원래 memoryview 개체는 변경되지 않습니다.

>>> m = memoryview(bytearray(b'abc'))
>>> mm = m.toreadonly()
>>> mm.tolist()
[89, 98, 99]
>>> mm[0] = 42
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> m[0] = 43
>>> mm.tolist()
[43, 98, 99]

버전 3.8의 새로운 기능.

release()

memoryview 개체에 의해 노출된 기본 버퍼를 해제합니다. 많은 객체는 뷰가 유지될 때 특별한 조치를 취합니다(예를 들어, bytearray는 일시적으로 크기 조정을 금지합니다). 따라서 release()를 호출하면 이러한 제한을 제거하고 가능한 한 빨리 모든 리소스를 해제하는 데 편리합니다.

이 메서드가 호출된 후 뷰에 대한 추가 작업은 ValueError를 발생시킵니다(여러 번 호출할 수 있는 release() 자체는 제외).

>>> m = memoryview(b'abc')
>>> m.release()
>>> m[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operation forbidden on released memoryview object

컨텍스트 관리 프로토콜은 with 문을 사용하여 유사한 효과를 위해 사용할 수 있습니다.

>>> with memoryview(b'abc') as m:
...     m[0]
...
97
>>> m[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operation forbidden on released memoryview object

버전 3.2의 새로운 기능.

cast(format[, shape])

memoryview를 새로운 형식이나 형태로 캐스트합니다. 모양은 기본적으로 [byte_length//new_itemsize]로, 이는 결과 보기가 1차원임을 의미합니다. 반환 값은 새로운 memoryview이지만 버퍼 자체는 복사되지 않습니다. 지원되는 캐스트는 1D -> C-연속 및 C-연속 -> 1D입니다.

대상 형식은 구조체 구문의 단일 요소 기본 형식으로 제한됩니다. 형식 중 하나는 바이트 형식(‘B’, ‘b’ 또는 ‘c’)이어야 합니다. 결과의 바이트 길이는 원래 길이와 같아야 합니다.

1D/long을 1D/unsigned 바이트로 캐스트:

>>> import array
>>> a = array.array('l', [1,2,3])
>>> x = memoryview(a)
>>> x.format
'l'
>>> x.itemsize
8
>>> len(x)
3
>>> x.nbytes
24
>>> y = x.cast('B')
>>> y.format
'B'
>>> y.itemsize
1
>>> len(y)
24
>>> y.nbytes
24

1D/unsigned 바이트를 1D/char로 캐스트:

>>> b = bytearray(b'zyz')
>>> x = memoryview(b)
>>> x[0] = b'a'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: memoryview: invalid value for format "B"
>>> y = x.cast('c')
>>> y[0] = b'a'
>>> b
bytearray(b'ayz')

1D/bytes를 3D/ints에서 1D/signed char로 변환:

>>> import struct
>>> buf = struct.pack("i"*12, *list(range(12)))
>>> x = memoryview(buf)
>>> y = x.cast('i', shape=[2,2,3])
>>> y.tolist()
>>> [[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]
>>> y.format
'i'
>>> y.itemsize
4
>>> len(y)
2
>>> y.nbytes
48
>>> z = y.cast('b')
>>> z.format
'b'
>>> z.itemsize
1
>>> len(z)
48
>>> z.nbytes
48

1D/unsigned long을 2D/unsigned long으로 캐스트:

>>> buf = struct.pack("L"*6, *list(range(6)))
>>> x = memoryview(buf)
>>> y = x.cast('L', shape=[2,3])
>>> len(y)
2
>>> y.nbytes
48
>>> y.tolist()
[[0, 1, 2], [3, 4, 5]]

버전 3.3의 새로운 기능.

버전 3.5에서 변경: 바이트 보기로 캐스팅할 때 소스 형식이 더 이상 제한되지 않습니다.

사용할 수 있는 몇 가지 읽기 전용 속성도 있습니다.

obj

memoryview의 기본 개체:

>>> b  = bytearray(b'xyz')
>>> m = memoryview(b)
>>> m.obj is b
True

버전 3.3의 새로운 기능.

nbytes

nbytes == 제품(모양) * 항목 크기 == len(m.tobytes()). 이것은 배열이 연속 표현에서 사용할 공간의 양(바이트)입니다. 반드시 len(m)과 같지는 않습니다:

>>> import array
>>> a = array.array('i', [1,2,3,4,5])
>>> m = memoryview(a)
>>> len(m)
5
>>> m.nbytes
20
>>> y = m[::2]
>>> len(y)
3
>>> y.nbytes
12
>>> len(y.tobytes())
12

다차원 배열:

>>> import struct
>>> buf = struct.pack("d"*12, *[1.5*x for x in range(12)])
>>> x = memoryview(buf)
>>> y = x.cast('d', shape=[3,4])
>>> y.tolist()
[[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]]
>>> len(y)
3
>>> y.nbytes
96

버전 3.3의 새로운 기능.

readonly

메모리가 읽기 전용인지 여부를 나타내는 부울입니다.

format

보기의 각 요소에 대한 형식(구조체 모듈 스타일)을 포함하는 문자열입니다. 임의의 형식 문자열을 사용하여 내보내기에서 memoryview를 만들 수 있지만 일부 메서드(예: tolist())는 기본 단일 요소 형식으로 제한됩니다.

버전 3.3에서 변경: 형식 ‘B’는 이제 struct 모듈 구문에 따라 처리됩니다. 이것은 memoryview(b’abc’)[0] == b’abc'[0] == 97을 의미합니다.

itemsize

memoryview의 각 요소 크기(바이트):

>>> import array, struct
>>> m = memoryview(array.array('H', [32000, 32001, 32002]))
>>> m.itemsize
2
>>> m[0]
32000
>>> struct.calcsize('H') == m.itemsize
True

ndim

메모리가 나타내는 다차원 배열의 차원 수를 나타내는 정수입니다.

shape

메모리의 모양을 N 차원 배열로 제공하는 ndim 길이의 정수 튜플.

버전 3.3에서 변경: ndim = 0일 때 None 대신 빈 튜플.

strides

배열의 각 차원에 대한 각 요소에 액세스하기 위한 크기를 바이트 단위로 제공하는 ndim 길이의 정수 튜플.

버전 3.3에서 변경: ndim = 0일 때 None 대신 빈 튜플.

suboffsets

PIL 스타일 배열에 내부적으로 사용됩니다. 이 값은 정보용입니다.

c_contiguous

메모리가 C-연속인지 여부를 나타내는 부울입니다.

버전 3.3의 새로운 기능.

f_contiguous

메모리가 Fortran 연속인지 여부를 나타내는 부울입니다.

버전 3.3의 새로운 기능.

contiguous

메모리가 연속적인지 여부를 나타내는 부울입니다.

버전 3.3의 새로운 기능.

Set Types — setfrozenset

집합 객체는 해시 가능한 개별 객체의 정렬되지 않은 모음입니다. 일반적인 용도로는 멤버십 테스트, 시퀀스에서 중복 제거, 교집합, 합집합, 차이 및 대칭 차이와 같은 수학적 연산 계산이 있습니다. (다른 컨테이너의 경우 내장 dict, list 및 tuple 클래스와 collections 모듈을 참조하십시오.)

다른 컬렉션과 마찬가지로 세트는 x in set, len(set) 및 for x in set를 지원합니다. 정렬되지 않은 컬렉션이므로 세트는 요소 위치나 삽입 순서를 기록하지 않습니다. 따라서 세트는 인덱싱, 슬라이싱 또는 기타 시퀀스 유사 동작을 지원하지 않습니다.

현재 두 가지 기본 제공 집합 유형인 set 및 frozenset이 있습니다. 집합 유형은 변경 가능합니다 — 내용은 add() 및 remove()와 같은 메서드를 사용하여 변경할 수 있습니다. 변경 가능하기 때문에 해시 값이 없으며 사전 키 또는 다른 집합의 요소로 사용할 수 없습니다. frozenset 유형은 변경 불가능하고 해시 가능합니다. 생성된 후에 내용을 변경할 수 없습니다. 따라서 사전 키 또는 다른 집합의 요소로 사용할 수 있습니다.

비어 있지 않은 세트(frozensets 아님)는 중괄호 안에 쉼표로 구분된 요소 목록을 배치하여 만들 수 있습니다(예: {‘jack’, ‘sjoerd’}).

두 클래스의 생성자는 동일하게 작동합니다.

class set([iterable])
class frozenset([iterable])

iterable에서 요소를 가져온 새로운 집합 또는 frozenset 객체를 반환합니다. 집합의 요소는 해시 가능해야 합니다. 집합 집합을 나타내려면 내부 집합이 frozenset 객체여야 합니다. iterable이 지정되지 않으면 새로운 빈 세트가 반환됩니다.

세트는 여러 가지 방법으로 만들 수 있습니다.

  • 중괄호 안에 쉼표로 구분된 요소 목록을 사용하세요: {‘jack’, ‘sjoerd’}
  • 집합 이해력 사용: {c for c in ‘abcadabra’ if c not in ‘abc’}
  • 유형 생성자 사용: set(), set(‘foobar’), set([‘a’, ‘b’, ‘foo’])

set 및 frozenset 인스턴스는 다음 작업을 제공합니다.

len(s)
집합 s의 요소 수를 반환합니다(s의 카디널리티).

x in s
x가 s에 속하는지 테스트합니다.

x not in s
s의 비회원에 대해 x를 테스트합니다.

isdisjoint(other)
집합에 다른 요소와 공통된 요소가 없으면 True를 반환합니다. 집합은 그들의 교집합이 빈 집합인 경우에만 서로소입니다.

issubset(other)
set <= other
집합의 모든 요소가 다른 요소에 있는지 테스트합니다.

set < other
집합이 other의 적절한 하위 집합인지 테스트합니다. 즉, set <= other 및 set != other입니다.

issuperset(other)
set >= other
other의 모든 요소가 집합에 있는지 테스트합니다.

set > other
집합이 other의 적절한 상위 집합인지 테스트합니다. 즉, set >= other 및 set != other입니다.

union(*others)
set | other | …
집합과 다른 모든 요소의 요소가 포함된 새 집합을 반환합니다.

intersection(*others)
set & other & …
집합과 다른 모든 요소에 공통적인 요소가 있는 새 집합을 반환합니다.

difference(*others)
set – other – …
다른 세트에는 없는 세트의 요소가 있는 새 세트를 반환합니다.

symmetric_difference(other)
set ^ other
집합 또는 다른 요소가 있는 새 집합을 반환하지만 둘 다는 아닙니다.

copy()
집합의 얕은 복사본을 반환합니다.

연산자가 아닌 버전의 union(), Intersection(), difference(), symmetric_difference(), issubset() 및 issuperset() 메서드는 모든 이터러블을 인수로 허용합니다. 대조적으로, 연산자 기반 상대는 인수를 설정해야 합니다. 이는 더 읽기 쉬운 set(‘abc’).intersection(‘cbs’)을 위해 set(‘abc’) & ‘cbs’와 같은 오류가 발생하기 쉬운 구성을 배제합니다.

set 및 frozenset 모두 set 비교를 지원합니다. 두 세트는 각 세트의 모든 요소가 다른 세트에 포함되어 있는 경우에만 동일합니다(각 세트는 다른 세트의 서브세트임). 집합은 첫 번째 집합이 두 번째 집합의 적절한 부분 집합인 경우에만 다른 집합보다 작습니다(부분 집합이지만 같지 않음). 첫 번째 집합이 두 번째 집합의 적절한 상위 집합인 경우에만 집합이 다른 집합보다 큽니다(상위 집합이지만 같지는 않음).

집합의 인스턴스는 구성원을 기준으로 frozenset의 인스턴스와 비교됩니다. 예를 들어 set(‘abc’) == frozenset(‘abc’)는 True를 반환하고 set([frozenset(‘abc’)])에서 set(‘abc’)도 마찬가지입니다.

부분 집합 및 같음 비교는 전체 순서 지정 함수로 일반화되지 않습니다. 예를 들어 비어 있지 않은 두 개의 분리된 집합은 서로 같지 않고 서로의 하위 집합이 아니므로 ab는 모두 False를 반환합니다.

세트는 부분 순서(하위 세트 관계)만 정의하므로 list.sort() 메서드의 출력은 세트 목록에 대해 정의되지 않습니다.

사전 키와 같은 집합 요소는 해시 가능해야 합니다.

집합 인스턴스를 frozenset과 혼합하는 이진 연산은 첫 번째 피연산자의 형식을 반환합니다. 예: frozenset(‘ab’) | set(‘bc’)는 frozenset의 인스턴스를 반환합니다.

다음 표에는 고정 집합의 불변 인스턴스에 적용되지 않는 집합에 사용할 수 있는 작업이 나열되어 있습니다.

update(*others)
set |= other | …
세트를 업데이트하고 다른 모든 요소를 추가합니다.

intersection_update(*others)
set &= other & …
집합에서 찾은 요소만 유지하고 집합을 업데이트합니다.

difference_update(*others)
set -= other | …
집합을 업데이트하고 다른 항목에서 찾은 요소를 제거합니다.

symmetric_difference_update(other)
set ^= other
세트를 업데이트하여 두 세트 모두가 아니라 두 세트 모두에서 발견된 요소만 유지합니다.

add(elem)
집합에 요소 요소를 추가합니다.

remove(elem)
집합에서 요소 요소를 제거합니다. elem이 세트에 포함되어 있지 않으면 KeyError를 발생시킵니다.

discard(elem)
요소 요소가 있는 경우 집합에서 요소 요소를 제거합니다.

pop()
집합에서 임의의 요소를 제거하고 반환합니다. 세트가 비어 있으면 KeyError 를 발생시킵니다.

clear()
집합에서 모든 요소를 제거합니다.

비연산자 버전의 update(), Intersection_update(), difference_update() 및 symmetric_difference_update() 메서드는 모든 이터러블을 인수로 허용합니다.

참고로, __contains__(), remove() 및 discard() 메서드에 대한 elem 인수는 집합일 수 있습니다. 동등한 frozenset 검색을 지원하기 위해 elem에서 임시 항목이 생성됩니다.

Mapping Types — dict

매핑 개체는 해시 가능한 값을 임의의 개체에 매핑합니다. 매핑은 변경 가능한 개체입니다. 현재 하나의 표준 매핑 유형인 사전만 있습니다. (다른 컨테이너에 대해서는 내장 목록, 집합 및 튜플 클래스와 컬렉션 모듈을 참조하십시오.)

사전의 키는 거의 임의의 값입니다. 해시할 수 없는 값, 즉 목록, 사전 또는 기타 변경 가능한 유형(객체 ID가 아닌 값으로 비교됨)을 포함하는 값은 키로 사용할 수 없습니다. 같음을 비교하는 값(예: 1, 1.0 및 True)은 동일한 사전 항목을 색인화하는 데 상호 교환적으로 사용할 수 있습니다.

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

선택적 위치 인수와 비어 있을 수 있는 키워드 인수 세트에서 초기화된 새 사전을 반환합니다.

다음과 같은 여러 방법으로 사전을 만들 수 있습니다.

  • 중괄호 안에 쉼표로 구분된 키: 값 쌍 목록 사용: {‘jack’: 4098, ‘sjoerd’: 4127} 또는 {4098: ‘jack’, 4127: ‘sjoerd’}
  • 사전 이해 사용: {}, {x: x ** 2 for x in range(10)}
  • 유형 생성자 사용: dict(), dict([(‘foo’, 100), (‘bar’, 200)]), dict(foo=100, bar=200)

위치 인수가 제공되지 않으면 빈 사전이 생성됩니다. 위치 인수가 지정되고 매핑 개체인 경우 매핑 개체와 동일한 키-값 쌍으로 사전이 생성됩니다. 그렇지 않으면 위치 인수는 반복 가능한 객체여야 합니다. iterable의 각 항목은 그 자체로 정확히 두 개의 객체가 있는 iterable이어야 합니다. 각 항목의 첫 번째 개체는 새 사전의 키가 되고 두 번째 개체는 해당 값이 됩니다. 키가 두 번 이상 발생하면 해당 키의 마지막 값이 새 사전의 해당 값이 됩니다.

키워드 인수가 주어지면 키워드 인수와 해당 값이 위치 인수에서 생성된 사전에 추가됩니다. 추가 중인 키가 이미 있는 경우 키워드 인수의 값이 위치 인수의 값을 대체합니다.

설명을 위해 다음 예제는 모두 {“one”: 1, “two”: 2, “three”: 3}과 같은 사전을 반환합니다.

>>> a = dict(one=1, two=2, three=3)
>>> b = {'one': 1, 'two': 2, 'three': 3}
>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d = dict([('two', 2), ('one', 1), ('three', 3)])
>>> e = dict({'three': 3, 'one': 1, 'two': 2})
>>> f = dict({'one': 1, 'three': 3}, two=2)
>>> a == b == c == d == e == f
True

첫 번째 예에서와 같이 키워드 인수를 제공하는 것은 유효한 Python 식별자인 키에 대해서만 작동합니다. 그렇지 않으면 유효한 키를 사용할 수 있습니다.

다음은 사전이 지원하는 작업입니다(따라서 사용자 지정 매핑 유형도 지원해야 함).

list(d)
사전에 사용된 모든 키 목록을 반환합니다. d.

len(d)
사전의 항목 수를 반환합니다. d.

d[key]
키 key로 d의 항목을 반환합니다. 키가 맵에 없으면 KeyError를 발생시킵니다.

dict의 하위 클래스가 메서드 __missing__()을 정의하고 키가 없는 경우, d[key] 연산은 키 키를 인수로 사용하여 해당 메서드를 호출합니다. 그런 다음 d[key] 작업은 __missing__(key) 호출에 의해 반환되거나 발생한 모든 항목을 반환하거나 발생시킵니다. 다른 작업이나 메서드는 __missing__()을 호출하지 않습니다. __missing__()이 정의되지 않은 경우, KeyError가 발생합니다. __missing__()은 메서드여야 합니다; 인스턴스 변수일 수 없습니다.

>>> class Counter(dict):
...     def __missing__(self, key):
...         return 0
>>> c = Counter()
>>> c['red']
0
>>> c['red'] += 1
>>> c['red']
1

위의 예는 collections.Counter 구현의 일부를 보여줍니다. 다른 __missing__ 메서드는 collections.defaultdict에서 사용됩니다.

d[key] = value
d[키]를 값으로 설정합니다.

del d[key]
d에서 d[key]를 제거합니다. 키가 맵에 없으면 KeyError를 발생시킵니다.

key in d
d에 키 키가 있으면 True를 반환하고 그렇지 않으면 False를 반환합니다.

key not in d
키를 입력하지 않는 것과 같습니다. d.

iter(d)
사전의 키에 대한 이터레이터를 반환합니다. 이것은 iter(d.keys())의 단축키입니다.

clear()
사전에서 모든 항목을 제거합니다.

copy()
사전의 얕은 복사본을 반환합니다.

classmethod fromkeys(iterable[, value])

iterable의 키와 value로 설정된 값으로 새 사전을 만듭니다.

fromkeys()는 새 사전을 반환하는 클래스 메서드입니다. 값은 기본적으로 없음입니다. 모든 값은 단일 인스턴스를 참조하므로 일반적으로 값이 빈 목록과 같은 변경 가능한 객체라는 것은 이치에 맞지 않습니다. 고유한 값을 얻으려면 대신 dict comprehension을 사용하십시오.

get(key[, default])
키가 사전에 있으면 키의 값을 반환하고 그렇지 않으면 기본값을 반환합니다. default가 주어지지 않으면 기본값은 None이므로 이 메서드는 KeyError를 발생시키지 않습니다.

items()
사전 항목((키, 값) 쌍)의 새 보기를 반환합니다. 뷰 객체 문서를 참조하십시오.

keys()
사전 키의 새 보기를 반환합니다. 뷰 객체 문서를 참조하십시오.

pop(key[, default])
키가 사전에 있으면 제거하고 해당 값을 반환하고 그렇지 않으면 기본값을 반환합니다. 기본값이 주어지지 않고 키가 사전에 없으면 KeyError가 발생합니다.

popitem()
사전에서 (키, 값) 쌍을 제거하고 반환합니다. 쌍은 LIFO 순서로 반환됩니다.

popitem()은 집합 알고리즘에서 자주 사용되는 사전을 파괴적으로 반복하는 데 유용합니다. 사전이 비어 있으면 popitem()을 호출하면 KeyError가 발생합니다.

버전 3.7에서 변경: 이제 LIFO 주문이 보장됩니다. 이전 버전에서 popitem()은 임의의 키/값 쌍을 반환했습니다.

reversed(d)
사전의 키에 대해 역 반복자를 반환합니다. 이는 reversed(d.keys())의 단축키입니다.

버전 3.8의 새로운 기능.

setdefault(key[, default])
키가 사전에 있으면 해당 값을 반환합니다. 그렇지 않은 경우 기본값으로 키를 삽입하고 기본값을 반환합니다. 기본값은 없음입니다.

update([other])
다른 키/값 쌍으로 사전을 업데이트하여 기존 키를 덮어씁니다. 없음을 반환합니다.

update()는 다른 딕셔너리 객체나 키/값 쌍의 이터러블(튜플 또는 길이가 2인 다른 이터러블로)을 허용합니다. 키워드 인수가 지정되면 사전이 해당 키/값 쌍으로 업데이트됩니다: d.update(red=1, blue=2).

values()
사전 값의 새 보기를 반환합니다. 뷰 객체 문서를 참조하십시오.

하나의 dict.values() 뷰와 다른 뷰 간의 동등성 비교는 항상 False를 반환합니다. 이는 dict.values()를 자신과 비교할 때도 적용됩니다.

>>> d = {'a': 1}
>>> d.values() == d.values()
False

d | other
d와 other의 병합된 키와 값으로 새 사전을 만듭니다. 둘 다 사전이어야 합니다. other의 값은 d와 다른 공유 키일 때 우선합니다.

버전 3.9의 새로운 기능.

d |= other
키/값 쌍의 매핑 또는 이터러블일 수 있는 other의 키와 값으로 사전 d를 업데이트합니다. other의 값은 d와 다른 공유 키일 때 우선합니다.

버전 3.9의 새로운 기능.

사전은 동일한 (키, 값) 쌍(순서에 관계없이)이 있는 경우에만 동일하게 비교됩니다. 순서 비교(‘<‘, ‘<=’, ‘>=’, ‘>’)는 TypeError를 발생시킵니다.

사전은 삽입 순서를 유지합니다. 키 업데이트는 순서에 영향을 미치지 않습니다. 삭제 후 추가된 키는 끝에 삽입됩니다.

>>> d = {"one": 1, "two": 2, "three": 3, "four": 4}
d
>>> {'one': 1, 'two': 2, 'three': 3, 'four': 4}
>>> list(d)
['one', 'two', 'three', 'four']
>>> list(d.values())
[1, 2, 3, 4]
>>> d["one"] = 42
>>> d
{'one': 42, 'two': 2, 'three': 3, 'four': 4}
>>> del d["two"]
>>> d["two"] = None
>>> d
{'one': 42, 'three': 3, 'four': 4, 'two': None}

버전 3.7에서 변경: 사전 순서는 삽입 순서로 보장됩니다. 이 동작은 3.6부터 CPython의 구현 세부 사항이었습니다.

사전 및 사전 보기는 되돌릴 수 있습니다.

>>> d = {"one": 1, "two": 2, "three": 3, "four": 4}
>>> d
{'one': 1, 'two': 2, 'three': 3, 'four': 4}
>>> list(reversed(d))
['four', 'three', 'two', 'one']
>>> list(reversed(d.values()))
[4, 3, 2, 1]
>>> list(reversed(d.items()))
[('four', 4), ('three', 3), ('two', 2), ('one', 1)]

버전 3.8에서 변경: 이제 사전을 되돌릴 수 있습니다.

또한 types.MappingProxyType을 사용하여 dict의 읽기 전용 보기를 만들 수 있습니다.

Dictionary view objects

dict.keys(), dict.values() 및 dict.items()가 반환하는 객체는 뷰 객체입니다. 사전 항목에 대한 동적 보기를 제공합니다. 즉, 사전이 변경되면 보기에 이러한 변경 사항이 반영됩니다.

딕셔너리 뷰는 각각의 데이터를 생성하고 멤버십 테스트를 지원하기 위해 반복될 수 있습니다.

len(dictview)
사전의 항목 수를 반환합니다.

iter(dictview)
사전에서 키, 값 또는 항목((키, 값)의 튜플로 표현됨)에 대한 이터레이터를 반환합니다.

키와 값은 삽입 순서대로 반복됩니다. 이를 통해 zip()을 사용하여 (값, 키) 쌍을 생성할 수 있습니다: pairs = zip(d.values(), d.keys()). 동일한 목록을 만드는 또 다른 방법은 pairs = [(v, k) for (k, v) in d.items()]입니다.

사전에 항목을 추가하거나 삭제하는 동안 보기를 반복하면 RuntimeError가 발생하거나 모든 항목을 반복하지 못할 수 있습니다.

버전 3.7에서 변경: 사전 순서는 삽입 순서로 보장됩니다.

x in dictview
x가 기본 사전의 키, 값 또는 항목에 있으면 True를 반환합니다(후자의 경우 x는 (키, 값) 튜플이어야 합니다).

reversed(dictview)
사전의 키, 값 또는 항목에 대해 역 반복자를 반환합니다. 뷰는 삽입의 역순으로 반복됩니다.

버전 3.8에서 변경: 이제 사전 보기를 되돌릴 수 있습니다.

dictview.mapping
뷰가 참조하는 원래 사전을 래핑하는 types.MappingProxyType을 반환합니다.

버전 3.10의 새로운 기능.

키 뷰는 항목이 고유하고 해시 가능하므로 설정과 유사합니다. 모든 값이 해시 가능하여 (키, 값) 쌍이 고유하고 해시 가능하면 항목 보기도 세트와 유사합니다. (항목이 일반적으로 고유하지 않기 때문에 값 보기는 집합과 같은 것으로 처리되지 않습니다.) 집합과 같은 보기의 경우 추상 기본 클래스 collections.abc.Set에 대해 정의된 모든 작업을 사용할 수 있습니다(예: ==, < , 또는 ^).

사전 보기 사용 예:

>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()

>>> # iteration
>>> n = 0
>>> for val in values:
...     n += val
>>> print(n)
504

>>> # keys and values are iterated over in the same order (insertion order)
>>> list(keys)
['eggs', 'sausage', 'bacon', 'spam']
>>> list(values)
[2, 1, 1, 500]

>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> del dishes['sausage']
>>> list(keys)
['bacon', 'spam']

>>> # set operations
>>> keys & {'eggs', 'bacon', 'salad'}
{'bacon'}
>>> keys ^ {'sausage', 'juice'}
{'juice', 'sausage', 'bacon', 'spam'}

>>> # get back a read-only proxy for the original dictionary
>>> values.mapping
mappingproxy({'bacon': 1, 'spam': 500})
>>> values.mapping['spam']
500

Context Manager Types

Python의 with 문은 컨텍스트 관리자가 정의한 런타임 컨텍스트의 개념을 지원합니다. 이는 명령문 본문이 실행되기 전에 입력되고 명령문이 종료될 때 종료되는 런타임 컨텍스트를 정의하는 사용자 정의 클래스를 허용하는 한 쌍의 메서드를 사용하여 구현됩니다.

contextmanager.__enter__()

런타임 컨텍스트를 입력하고 이 개체 또는 런타임 컨텍스트와 관련된 다른 개체를 반환합니다. 이 메서드가 반환하는 값은 이 컨텍스트 관리자를 사용하여 with 문의 as 절에 있는 식별자에 바인딩됩니다.

자신을 반환하는 컨텍스트 관리자의 예는 파일 개체입니다. 파일 객체는 __enter__()에서 자신을 반환하여 open()이 with 문에서 컨텍스트 표현식으로 사용될 수 있도록 합니다.

관련 객체를 반환하는 컨텍스트 관리자의 예는 decimal.localcontext()에서 반환하는 것입니다. 이러한 관리자는 활성 십진 컨텍스트를 원래 십진 컨텍스트의 복사본으로 설정한 다음 복사본을 반환합니다. 이렇게 하면 with 문 외부의 코드에 영향을 주지 않고 with 문의 본문에서 현재 십진수 컨텍스트를 변경할 수 있습니다.

contextmanager.__exit__(exc_typeexc_valexc_tb)

런타임 컨텍스트를 종료하고 발생한 예외를 억제해야 하는지 여부를 나타내는 부울 플래그를 반환합니다. with 문의 본문을 실행하는 동안 예외가 발생한 경우 인수에는 예외 유형, 값 및 역추적 정보가 포함됩니다. 그렇지 않으면 세 인수 모두 None입니다.

이 메서드에서 참 값을 반환하면 with 문이 예외를 억제하고 with 문 바로 다음에 오는 문으로 실행을 계속합니다. 그렇지 않으면 이 메서드가 실행을 마친 후에도 예외가 계속 전파됩니다. 이 메서드를 실행하는 동안 발생하는 예외는 with 문의 본문에서 발생한 모든 예외를 대체합니다.

전달된 예외는 명시적으로 다시 발생해서는 안 됩니다. 대신 이 메서드는 메서드가 성공적으로 완료되었고 발생한 예외를 억제하지 않으려는 것을 나타내기 위해 false 값을 반환해야 합니다. 이를 통해 컨텍스트 관리 코드는 __exit__() 메서드가 실제로 실패했는지 여부를 쉽게 감지할 수 있습니다.

Python은 손쉬운 스레드 동기화, 파일 또는 기타 개체의 즉각적인 종료, 활성 십진수 산술 컨텍스트의 간단한 조작을 지원하기 위해 여러 컨텍스트 관리자를 정의합니다. 특정 유형은 컨텍스트 관리 프로토콜 구현 이상으로 특별히 취급되지 않습니다. 몇 가지 예는 contextlib 모듈을 참조하십시오.

Python의 생성기와 contextlib.contextmanager 데코레이터는 이러한 프로토콜을 구현하는 편리한 방법을 제공합니다. 제너레이터 함수가 contextlib.contextmanager 데코레이터로 데코레이트된 경우, 데코레이트되지 않은 제너레이터 함수에 의해 생성된 반복자가 아니라 필요한 __enter__() 및 __exit__() 메서드를 구현하는 컨텍스트 관리자를 반환합니다.

Python/C API의 Python 개체에 대한 유형 구조에는 이러한 메서드에 대한 특정 슬롯이 없습니다. 이러한 메서드를 정의하려는 확장 유형은 이를 일반 Python 액세스 가능 메서드로 제공해야 합니다. 런타임 컨텍스트를 설정하는 오버헤드와 비교할 때 단일 클래스 사전 조회의 오버헤드는 무시할 수 있습니다.

Type Annotation Types — Generic AliasUnion

유형 주석의 핵심 기본 제공 유형은 Generic Alias 및 Union입니다.

Generic Alias Type

GenericAlias 개체는 일반적으로 클래스를 첨자로 만들어 만듭니다. 이들은 list 또는 dict와 같은 컨테이너 클래스와 함께 가장 자주 사용됩니다. 예를 들어 list[int]는 인수 int로 목록 클래스를 첨자로 만들어 만든 GenericAlias 객체입니다. GenericAlias 객체는 주로 유형 주석과 함께 사용하기 위한 것입니다.

참고 일반적으로 클래스가 특수 메서드 __class_getitem__()을 구현하는 경우에만 클래스를 첨자화할 수 있습니다.

GenericAlias 개체는 매개 변수가 있는 제네릭을 구현하는 제네릭 형식의 프록시 역할을 합니다.

컨테이너 클래스의 경우 클래스 구독에 제공된 인수는 객체가 포함하는 요소의 유형을 나타낼 수 있습니다. 예를 들어, set[bytes]는 모든 요소가 바이트 유형인 집합을 나타내기 위해 유형 주석에 사용할 수 있습니다.

__class_getitem__()을 정의하지만 컨테이너가 아닌 클래스의 경우, 클래스의 구독에 제공된 인수는 종종 객체에 정의된 하나 이상의 메서드의 반환 유형을 나타냅니다. 예를 들어 정규 표현식은 str 데이터 유형과 bytes 데이터 유형 모두에서 사용할 수 있습니다.

  • x = re.search(‘foo’, ‘foo’)인 경우 x는 x.group(0) 및 x[0]의 반환 값이 모두 str 유형인 re.Match 객체가 됩니다. GenericAlias re.Match[str]를 사용하여 유형 주석에서 이러한 종류의 객체를 나타낼 수 있습니다.
  • y = re.search(b’bar’, b’bar’)인 경우(바이트의 경우 b 참고) y도 re.Match의 인스턴스가 되지만 y.group(0) 및 y의 반환 값 [0]은 둘 다 바이트 유형입니다. 유형 주석에서 re.Match[bytes]를 사용하여 이러한 다양한 re.Match 객체를 나타냅니다.

GenericAlias 개체는 클래스 types.GenericAlias의 인스턴스이며 GenericAlias 개체를 직접 만드는 데 사용할 수도 있습니다.

T[X, Y, …]

사용된 T에 따라 유형 X, Y 등으로 매개변수화된 유형 T를 나타내는 GenericAlias를 작성합니다. 예를 들어 float 요소를 포함하는 목록을 기대하는 함수는 다음과 같습니다.

def average(values: list[float]) -> float:
    return sum(values) / len(values)

키 유형과 값 유형을 나타내는 두 가지 유형 매개변수를 예상하는 제네릭 유형인 dict를 사용하는 매핑 객체의 또 다른 예입니다. 이 예에서 함수는 str 유형의 키와 int 유형의 값이 있는 사전을 예상합니다.

def send_post_request(url: str, body: dict[str, int]) -> None:
    ...

내장 함수 isinstance() 및 issubclass()는 두 번째 인수로 GenericAlias 유형을 허용하지 않습니다.

>>> isinstance([1, 2], list[str])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() argument 2 cannot be a parameterized generic

Python 런타임은 유형 주석을 적용하지 않습니다. 이는 제네릭 형식 및 해당 형식 매개 변수로 확장됩니다. GenericAlias에서 컨테이너 객체를 생성할 때 컨테이너의 요소는 해당 유형에 대해 확인되지 않습니다. 예를 들어 다음 코드는 권장되지 않지만 오류 없이 실행됩니다.

>>> t = list[str]
>>> t([1, 2, 3])
[1, 2, 3]

또한 매개변수화된 제네릭은 객체 생성 중에 유형 매개변수를 지웁니다.

>>> t = list[str]
>>> type(t)
<class 'types.GenericAlias'>

>>> l = t()
>>> type(l)
<class 'list'>

제네릭에서 repr() 또는 str()을 호출하면 매개변수화된 유형이 표시됩니다.

>>> repr(list[int])
'list[int]'

>>> str(list[int])
'list[int]'

일반 컨테이너의 __getitem__() 메서드는 dict[str][str]과 같은 실수를 허용하지 않는 예외를 발생시킵니다:

>>> dict[str][str]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: There are no type variables left in dict[str]

그러나 이러한 표현은 유형 변수를 사용할 때 유효합니다. 인덱스에는 GenericAlias 객체의 __args__에 있는 유형 변수 항목만큼 많은 요소가 있어야 합니다.

>>> from typing import TypeVar
>>> Y = TypeVar('Y')
>>> dict[str, Y][int]
dict[str, int]

Standard Generic Classes

다음 표준 라이브러리 클래스는 매개변수화된 제네릭을 지원합니다. 이 목록은 완전하지 않습니다.

Special Attributes of GenericAlias objects

모든 매개변수화된 제네릭은 특수한 읽기 전용 속성을 구현합니다.

genericalias.__origin__
이 특성은 매개 변수가 없는 일반 클래스를 가리킵니다.

>>> list[int].__origin__
<class 'list'>

genericalias.__args__
이 어트리뷰트는 제네릭 클래스의 원래 __class_getitem__() 에 전달된 제네릭 유형의 튜플(길이 1 가능)입니다:

>>> dict[str, list[int]].__args__
(<class 'str'>, list[int])

genericalias.__parameters__
이 속성은 __args__에 있는 고유한 유형 변수의 늦게 계산된 튜플(비어 있을 수 있음)입니다.

>>> from typing import TypeVar

>>> T = TypeVar('T')
>>> list[T].__parameters__
(~T,)

참고 typing.ParamSpec 매개변수가 있는 GenericAlias 객체는 주로 타이핑.ParamSpec이 정적 유형 검사를 위한 것이기 때문에 대체 후에 올바른 __parameters__를 가질 수 없습니다.

genericalias.__unpacked__

별칭이 * 연산자를 사용하여 압축 해제된 경우 true인 부울입니다(TypeVarTuple 참조).

버전 3.11의 새로운 기능.

또한보십시오
PEP 484 – 유형 힌트
유형 주석을 위한 Python의 프레임워크를 소개합니다.

PEP 585 – 표준 컬렉션의 유형 힌트 제네릭
특수 클래스 메서드 __class_getitem__()을 구현하는 경우 표준 라이브러리 클래스를 기본적으로 매개변수화하는 기능을 소개합니다.

Generics, user-defined genericstyping.Generic
런타임에 매개변수화할 수 있고 정적 유형 검사기가 이해할 수 있는 제네릭 클래스를 구현하는 방법에 대한 문서입니다.

버전 3.9의 새로운 기능.

Union Type

유니온 객체는 | (bitwise or) 여러 유형 객체에 대한 연산. 이러한 유형은 주로 유형 주석을 위한 것입니다. 공용체 유형 표현식은 typing.Union에 비해 더 깔끔한 유형 암시 구문을 사용합니다.

X | Y | …

X, Y 등의 유형을 보유하는 통합 개체를 정의합니다. 엑스 | Y는 X 또는 Y를 의미합니다. typing.Union[X, Y]와 동일합니다. 예를 들어, 다음 함수는 int 또는 float 유형의 인수를 예상합니다.

def square(number: int | float) -> int | float:
    return number ** 2

union_object == other

공용체 개체는 다른 공용체 개체와 같은지 테스트할 수 있습니다.

  • 노동 조합은 평평합니다: (int | str) | float == int | str | float
  • 중복 유형이 제거됩니다: int | str | int == int | str
  • 공용체를 비교할 때 순서는 무시됩니다:int | str == str | int
  • typing.Union과 호환됩니다. 조합::int | str == typing.Union[int, str]
  • 옵셔널 타입은 None과 합집합으로 쓸 수 있습니다:str | None == typing.Optional[str]

isinstance(obj, union_object)
issubclass(obj, union_object)

isinstance() 및 issubclass()에 대한 호출도 공용체 객체로 지원됩니다.

>>> isinstance("", int | str)
True

그러나 매개변수화된 제네릭을 포함하는 통합 개체는 사용할 수 없습니다.

>>> isinstance(1, int | list[int])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() argument 2 cannot contain a parameterized generic

공용체 객체에 대한 사용자 노출 유형은 types.UnionType에서 액세스할 수 있으며 isinstance() 검사에 사용할 수 있습니다. 다음 유형에서 개체를 인스턴스화할 수 없습니다.

>>> import types
>>> isinstance(int | str, types.UnionType)
True
>>> types.UnionType()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot create 'types.UnionType' instances

참고 유형 객체에 대한 __or__() 메서드가 추가되어 구문 X | Y. 메타클래스가 __or__()를 구현하면 Union이 이를 재정의할 수 있습니다.

>>> class M(type):
...     def __or__(self, other):
...         return "Hello"
... 
>>> class C(metaclass=M):
...     pass
... 
>>> C | int
'Hello'
>>> int | C
int | __main__.C

PEP 604 – X를 제안하는 PEP | Y 구문 및 Union 유형.

버전 3.10의 새로운 기능.

Other Built-in Types

인터프리터는 다른 여러 종류의 개체를 지원합니다. 이들 중 대부분은 한두 가지 작업만 지원합니다.

Modules

모듈에 대한 유일한 특수 작업은 속성 액세스: m.name입니다. 여기서 m은 모듈이고 이름은 m의 기호 테이블에 정의된 이름에 액세스합니다. 모듈 속성을 할당할 수 있습니다. (import 문은 엄밀히 말하면 모듈 객체에 대한 작업이 아닙니다. import foo는 foo라는 모듈 객체가 있어야 하는 것이 아니라 어딘가에 foo라는 모듈에 대한 (외부) 정의가 필요합니다.)

모든 모듈의 특수 속성은 __dict__입니다. 이것은 모듈의 심볼 테이블을 포함하는 사전입니다. 이 사전을 수정하면 실제로 모듈의 기호 테이블이 변경되지만 __dict__ 속성에 대한 직접 할당은 불가능합니다(m.__dict__[‘a’] = 1로 작성할 수 있으며 m.a를 1로 정의하지만 m은 작성할 수 없습니다. .__dict__ = {}). __dict__를 직접 수정하는 것은 권장하지 않습니다.

인터프리터에 내장된 모듈은 다음과 같이 작성됩니다: <module 'sys' (built-in)>. 파일에서 로드되면<module 'os' from '/usr/local/lib/pythonX.Y/os.pyc'>로 작성됩니다.

Classes and Class Instances

See Objects, values and types and Class definitions for these.

Functions

함수 객체는 함수 정의에 의해 생성됩니다. 함수 개체에 대한 유일한 작업은 func(argument-list)를 호출하는 것입니다.

함수 개체에는 실제로 내장 함수와 사용자 정의 함수의 두 가지 종류가 있습니다. 둘 다 동일한 작업(함수 호출)을 지원하지만 구현이 다르기 때문에 개체 유형이 다릅니다.

자세한 내용은 함수 정의를 참조하십시오.

Methods

메소드는 속성 표기법을 사용하여 호출되는 함수입니다. 내장 메서드(예: 목록의 append())와 클래스 인스턴스 메서드의 두 가지 특징이 있습니다. 내장 메소드는 이를 지원하는 유형으로 설명됩니다.

인스턴스를 통해 메서드(클래스 네임스페이스에 정의된 함수)에 액세스하면 바인딩된 메서드(인스턴스 메서드라고도 함) 개체라는 특수 개체를 얻게 됩니다. 호출되면 자체 인수를 인수 목록에 추가합니다. 바인딩된 메서드에는 두 가지 특수한 읽기 전용 속성이 있습니다. m.__self__는 메서드가 작동하는 객체이고 m.__func__은 메서드를 구현하는 함수입니다. m(arg-1, arg-2, …, arg-n)을 호출하는 것은 m.__func__(m.__self__, arg-1, arg-2, …, arg-n)을 호출하는 것과 완전히 동일합니다.

함수 개체와 마찬가지로 바인딩된 메서드 개체는 임의 속성 가져오기를 지원합니다. 그러나 메소드 속성은 실제로 기본 함수 객체(meth.__func__)에 저장되므로 바인딩된 메소드에 메소드 속성을 설정하는 것은 허용되지 않습니다. 메소드에 속성을 설정하려고 하면 AttributeError가 발생합니다. 메서드 속성을 설정하려면 기본 함수 개체에 명시적으로 설정해야 합니다.

>>> class C:
...     def method(self):
...         pass
... 
>>> c = C()
>>> c.method.whoami = 'my name is method'  # can't set on the method
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'method' object has no attribute 'whoami'
>>> c.method.__func__.whoami = 'my name is method'
>>> c.method.whoami
'my name is method'

자세한 내용은 표준 유형 계층 구조를 참조하십시오.

Code Objects

코드 개체는 함수 본문과 같은 “의사 컴파일된” 실행 가능 Python 코드를 나타내기 위해 구현에서 사용됩니다. 전역 실행 환경에 대한 참조를 포함하지 않기 때문에 함수 개체와 다릅니다. 코드 객체는 내장된 compile() 함수에 의해 반환되며 __code__ 속성을 통해 함수 객체에서 추출할 수 있습니다. 코드 모듈도 참조하십시오.

__code__에 액세스하면 인수 obj 및 “__code__”를 사용하여 감사 이벤트 object.__getattr__이 발생합니다.

코드 객체는 (소스 문자열 대신) exec() 또는 eval() 내장 함수에 전달하여 실행하거나 평가할 수 있습니다.

자세한 내용은 표준 유형 계층 구조를 참조하십시오.

Type Objects

유형 객체는 다양한 객체 유형을 나타냅니다. 객체의 유형은 내장 함수 type()에 의해 액세스됩니다. 유형에 대한 특수 연산은 없습니다. 표준 모듈 유형은 모든 표준 내장 유형의 이름을 정의합니다.

유형은 다음과 같이 작성됩니다: .

The Null Object

이 객체는 명시적으로 값을 반환하지 않는 함수에 의해 반환됩니다. 특별한 작업을 지원하지 않습니다. None(내장 이름)이라는 이름의 null 개체가 정확히 하나 있습니다. type(None)()은 동일한 싱글톤을 생성합니다.

None이라고 씁니다.

The Ellipsis Object

이 개체는 일반적으로 슬라이싱에 사용됩니다(슬라이싱 참조). 특별한 작업을 지원하지 않습니다. Ellipsis(내장 이름)라는 이름의 줄임표 개체가 정확히 하나 있습니다. type(Ellipsis)()는 Ellipsis 싱글톤을 생성합니다.

줄임표 또는 …로 작성됩니다.

The NotImplemented Object

이 개체는 지원하지 않는 유형에 대한 작업을 요청하면 비교 및 이항 작업에서 반환됩니다. 자세한 내용은 비교를 참조하십시오. NotImplemented 개체는 정확히 하나입니다. type(NotImplemented)()는 싱글톤 인스턴스를 생성합니다.

NotImplemented로 작성됩니다.

Boolean Values

부울 값은 두 개의 상수 개체 False 및 True입니다. 그것들은 진리 값을 나타내는 데 사용됩니다(다른 값도 거짓 또는 참으로 간주될 수 있음). 숫자 컨텍스트(예: 산술 연산자의 인수로 사용되는 경우)에서는 각각 정수 0과 1처럼 동작합니다. 내장 함수 bool()은 값이 진리 값으로 해석될 수 있는 경우 모든 값을 부울로 변환하는 데 사용할 수 있습니다(위의 진리 값 테스트 섹션 참조).

그것들은 각각 False와 True로 쓰여집니다.

Internal Objects

이 정보는 표준 유형 계층 구조를 참조하십시오. 스택 프레임 객체, 트레이스백 객체 및 슬라이스 객체를 설명합니다.

Special Attributes

이 구현은 몇 가지 특수한 읽기 전용 속성을 관련이 있는 여러 개체 유형에 추가합니다. 이들 중 일부는 dir() 내장 함수에 의해 보고되지 않습니다.

object.__dict__
객체의 (쓰기 가능한) 속성을 저장하는 데 사용되는 사전 또는 기타 매핑 객체입니다.

instance.__class__
클래스 인스턴스가 속한 클래스입니다.

class.__bases__
클래스 개체의 기본 클래스 튜플입니다.

definition.__name__
클래스, 함수, 메서드, 설명자 또는 생성기 인스턴스의 이름입니다.

definition.__qualname__
클래스, 함수, 메서드, 설명자 또는 생성기 인스턴스의 정규화된 이름입니다.

버전 3.3의 새로운 기능.

class.__mro__
이 특성은 메서드 확인 중에 기본 클래스를 찾을 때 고려되는 클래스의 튜플입니다.

class.mro()
이 메서드는 인스턴스에 대한 메서드 해결 순서를 사용자 지정하기 위해 메타클래스에서 재정의할 수 있습니다. 클래스 인스턴스화 시 호출되며 그 결과는 __mro__에 저장됩니다.

class.__subclasses__()
각 클래스는 직계 하위 클래스에 대한 약한 참조 목록을 유지합니다. 이 메서드는 아직 살아있는 모든 참조 목록을 반환합니다. 목록은 정의 순서입니다. 예:

>>> int.__subclasses__()
[<class 'bool'>]

Integer string conversion length limitation

CPython에는 서비스 거부 공격을 완화하기 위해 int와 str 간 변환에 대한 전역 제한이 있습니다. 이 제한은 10진수 또는 기타 2의 거듭제곱이 아닌 숫자 밑수에만 적용됩니다. 16진수, 8진수 및 2진수 변환은 무제한입니다. 제한을 구성할 수 있습니다.

CPython의 int 유형은 이진 형식으로 저장된 임의의 길이 숫자입니다(일반적으로 “bignum”이라고 함). 밑이 2의 거듭제곱이 아닌 한 선형 시간에서 문자열을 이진 정수로 또는 이진 정수를 문자열로 변환할 수 있는 알고리즘은 존재하지 않습니다. 밑이 10인 가장 잘 알려진 알고리즘도 준이차 복잡성을 가집니다. int(‘1’ * 500_000)과 같은 큰 값을 변환하면 빠른 CPU에서 1초 이상 걸릴 수 있습니다.

변환 크기를 제한하면 CVE-2020-10735를 방지할 수 있는 실용적인 방법이 제공됩니다.

비선형 변환 알고리즘이 관련된 경우 입력 또는 출력 문자열의 숫자 문자 수에 제한이 적용됩니다. 밑줄과 기호는 제한에 포함되지 않습니다.

작업이 제한을 초과하면 ValueError가 발생합니다.

>>> import sys
>>> sys.set_int_max_str_digits(4300)  # Illustrative, this is the default.
>>> _ = int('2' * 5432)
Traceback (most recent call last):
...
ValueError: Exceeds the limit (4300 digits) for integer string conversion: value has 5432 digits; use sys.set_int_max_str_digits() to increase the limit.
>>> i = int('2' * 4300)
>>> len(str(i))
4300
>>> i_squared = i*i
>>> len(str(i_squared))
Traceback (most recent call last):
...
ValueError: Exceeds the limit (4300 digits) for integer string conversion: value has 8599 digits; use sys.set_int_max_str_digits() to increase the limit.
>>> len(hex(i_squared))
7144
>>> assert int(hex(i_squared), base=16) == i*i  # Hexadecimal is unlimited.

기본 제한은 sys.int_info.default_max_str_digits에 제공된 대로 4300자리입니다. 구성할 수 있는 최저 제한은 sys.int_info.str_digits_check_threshold에 제공된 대로 640자리입니다.

확인:

>>> import sys
>>> assert sys.int_info.default_max_str_digits == 4300, sys.int_info
>>> assert sys.int_info.str_digits_check_threshold == 640, sys.int_info
>>> msg = int('578966293710682886880994035146873798396722250538762761564'
          '9252925514383915483333812743580549779436104706260696366600'
          '571186405732').to_bytes(53, 'big')

버전 3.11의 새로운 기능.

Affected APIs

이 제한은 int와 str 또는 바이트 간의 잠재적으로 느린 변환에만 적용됩니다.

  • 기본 10을 사용하는 int(string).
  • 2의 거듭제곱이 아닌 모든 염기에 대한 int(string, base).
  • str(integer).
  • repr(integer).
  • 10진수로의 기타 문자열 변환(예: f”{integer}”, “{}”.format(integer) 또는 b”%d” % integer)

제한 사항은 선형 알고리즘이 있는 함수에는 적용되지 않습니다.

Configuring the limit

Python이 시작되기 전에 환경 변수 또는 인터프리터 명령줄 플래그를 사용하여 제한을 구성할 수 있습니다.

  • PYTHONINTMAXSTRDIGITS, 예. PYTHONINTMAXSTRDIGITS=640 python3 제한을 640으로 설정하거나 PYTHONINTMAXSTRDIGITS=0 python3 제한을 비활성화합니다.
  • -X int_max_str_digits, 예: python3 -X int_max_str_digits=640
  • sys.flags.int_max_str_digits는 PYTHONINTMAXSTRDIGITS 또는 -X int_max_str_digits 값을 포함합니다. env var와 -X 옵션이 모두 설정된 경우 -X 옵션이 우선합니다. -1 값은 둘 다 설정되지 않았음을 나타내므로 초기화 중에 sys.int_info.default_max_str_digits 값이 사용되었습니다.

코드에서 다음 sys API를 사용하여 현재 제한을 검사하고 새 제한을 설정할 수 있습니다.

  • sys.get_int_max_str_digits() 및 sys.set_int_max_str_digits()는 인터프리터 전체 제한에 대한 getter 및 setter입니다. 부 통역사는 자체 제한이 있습니다.

기본값 및 최소값에 대한 정보는 sys.int_info에서 찾을 수 있습니다.

  • sys.int_info.default_max_str_digits는 컴파일된 기본 제한입니다.
  • sys.int_info.str_digits_check_threshold는 제한에 허용되는 가장 낮은 값입니다(비활성화하는 0 제외).

버전 3.11의 새로운 기능.

경고: 주의 하한을 설정하면 문제가 발생할 수 있습니다. 드물기는 하지만 소스에 최소 임계값을 초과하는 십진수 정수 상수가 포함된 코드가 존재합니다. 제한을 설정하면 제한보다 긴 10진수 리터럴을 포함하는 Python 소스 코드는 구문 분석 중에, 일반적으로 시작 시 또는 가져오기 시 또는 설치 시에도 오류가 발생합니다. 최신 .pyc가 아직 존재하지 않는 경우 언제든지 발생합니다. 코드를 위해. 이러한 큰 상수를 포함하는 소스에 대한 해결 방법은 제한이 없으므로 0x 16진수 형식으로 변환하는 것입니다.

하한을 사용하는 경우 응용 프로그램을 철저하게 테스트하십시오. .py 소스를 .pyc 파일로 미리 컴파일하기 위해 Python을 호출할 수 있는 모든 설치 단계와 시작 중에 적용되도록 환경 또는 플래그를 통해 초기에 설정된 제한으로 테스트를 실행해야 합니다.

Recommended configuration

기본 sys.int_info.default_max_str_digits는 대부분의 응용 프로그램에 적합할 것으로 예상됩니다. 애플리케이션에 다른 제한이 필요한 경우 이러한 API가 3.11 이전 버전의 보안 패치 릴리스에 추가되었으므로 Python 버전에 구애받지 않는 코드를 사용하여 기본 진입점에서 설정합니다.

예:

>>> import sys
>>> if hasattr(sys, "set_int_max_str_digits"):
...     upper_bound = 68000
...     lower_bound = 4004
...     current_limit = sys.get_int_max_str_digits()
...     if current_limit == 0 or current_limit > upper_bound:
...         sys.set_int_max_str_digits(upper_bound)
...     elif current_limit < lower_bound:
...         sys.set_int_max_str_digits(lower_bound)

완전히 비활성화해야 하는 경우 0으로 설정합니다.

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